R函数带循环附加避免(使用lapply代替)

时间:2016-07-22 15:21:06

标签: r function functional-programming lapply

我听说不推荐在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)

1 个答案:

答案 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秒才能运行。