我想加快基於字符數組調用另一個函數(fn1
)的以下函數(fndf
)。如何利用`apply/lapply/sapply`而不是`for`循環來提高性能?
fndf
- 新功能
list_s
- 字符數組 - chr [1:400]
rdata_i
- 空數據幀(初始化)
fn1
- 另一個自定義功能
rdata2
- 與3000 obs of 40 variables
mdata
數據幀 - data.frame
nm
- character
fndf = function(list_s, rdata2){
rdata_i = df <- data.frame(Date=as.Date(character()),
File=character(),
User=character(),
stringsAsFactors=FALSE)
for(i in 1:length(list_s))
{
rdata = fn1(list_s[i], rdata2)
rdata_i = rbind(rdata, rdata_i)
}
return(unique(rdata_i))
}
我們是否也可以提高以下function
的性能?
fn1 = function(nm, mdata){
n0 = mdata[mdata$Sign==nm,]
cn0 = unique(c(n0$Name))
repeat{
n1c = mdata[mdata$Mgr %in% cn0,]
n0 = unique(rbind(n0,n1c))
if(nrow(n1c)==0){
return(n0)
break
}
cn0= unique(c(n1c$Name))
}
}
您的放緩可能是由於'rdata_i = rbind(rdata,rdata_i)';在for循環中增長對象通常是不好的做法(太多複製和移動數據)。查看「R地獄」書,它對此有一些建議。 – baptiste
試試這個,'ld = lapply(list_s,fn1,rdata2); do.call(rbind,ld)' – baptiste
您需要讓您的問題具有可重現性。可能,你甚至不需要循環。 – Roland