我听说不推荐在R中使用for循环,因为它很慢。我听说我应该使用lapply
代替,因为它要求C提高效率。
问题:是否可以向我展示如何将以下示例转换为lapply
高效代码(或任何其他apply
sapply
同一个家庭)?
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)
答案 0 :(得分:4)
以下是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秒才能运行。