2016-07-22 47 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