S12000
S12000

Reputation: 3396

R function with loop append avoiding for (using lapply instead)

I have heard that it is not recommended to use for loops in R mainly because it is slow. I have heard that I should use lapply instead because it's calling C for efficiency.

Question: Would it be possible to show me how to transform the following example into a lapply efficient code (or any other apply sapply from the same family)?

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)

Upvotes: 0

Views: 847

Answers (1)

lmo
lmo

Reputation: 38520

Here is an lapply method:

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)

Note that there isn't much (if any) speed increase, because the body of your function takes a long time to execute. This swamps any potential speed up with lapply.

On my computer, both methods take about 20 seconds to run.

Upvotes: 4

Related Questions