2016-07-22 45 views
0

我聽說不建議在R中使用for循環,主要是因爲它的速度很慢。我聽說我應該使用lapply而不是因爲它調用C來提高效率。帶循環追加的R函數避免使用(使用lapply代替)

問題:是否可以告訴我如何把下面的例子爲lapply高效的代碼(或來自同一家庭的任何其他applysapply)?

myFun <- function(loop){ 
    result = data.frame() #init new df 
    for(iteration in 1:loop){ 
    generateRnorm1 = matrix(data = rnorm(n = 1000000), nrow = 10000, ncol = 10000) 
    generateRnorm2 = matrix(data = rnorm(n = 1000000), nrow = 10000, ncol = 10000) 
    iterationResult = sum(generateRnorm1, generateRnorm2) 
    bindIterationResult = cbind(iteration, iterationResult) 
    result = rbind(result, bindIterationResult) 
    } 
    return(result) 
} 

test = myFun(loop = 10) 
+1

參見[伯恩斯[R魔族]的第4章(http://www.burns-stat.com/pages/Tutor/R_inferno.pdf) –

+0

謝謝,我會讀它 – S12000

回答

3

這裏是一個lapply方法:

myFun2 <- function(loop){ 
    generateRnorm1 = matrix(data = rnorm(n = 1000000), nrow = 10000, ncol = 10000) 
    generateRnorm2 = matrix(data = rnorm(n = 1000000), nrow = 10000, ncol = 10000) 
    sum(generateRnorm1, generateRnorm2) 
} 

# run function over 1:10 
myList <- lapply(seq.int(10), myFun2) 
# rbind the resulting list 
result2 <- do.call(rbind, myList) 

注意,沒有太多的(如果有的話)的速度增加,因爲你的函數體需要很長的時間來執行。這可以通過lapply來加速任何潛在的速度。

在我的電腦上,兩種方法都需要大約20秒的時間才能運行。

+0

非常感謝它回答我的問題 – S12000