Surely a facepalm question, sorry. I have been trying to RTFM and google that but no luck.
I am trying to make a silly function in R that takes a vector as argument, loops through it with a for loop and does a very simple addition to each component.
func1 <- function(vector) {
  vr <- c() ### an empty vector 
  for (i in 1:length(vector)) { 
    vr <- vector[i]+i
  }
}
To me this looks correct, but I am always getting a NULL vector. Why?
You could write that much more efficiently like this:
func1 <- function(vector){
    vector + seq_along(vector)
}
This way you are taking advantage of vector addition.
For the sake of completeness, let's benchmark these two solutions. Here is the general loop solution:
func2 <- function(vector) {
    vr <- c() ### an empty vector 
    for (i in 1:length(vector)) { 
        vr[i] <- vector[i]+i
    }
    vr
}
As a step up, there is also the in-place solution
func3 <- function(vector) {    
    for (i in 1:length(vector)) { 
        vector[i] <- vector[i]+i
    }
    vector
}
Using microbenchmark we can see that the vectorized solution is by far the most efficient.
vec <- sample(100000, 10000)
library(microbenchmark)
microbenchmark(func1(vec), func3(vec), func2(vec))
Unit: microseconds
       expr       min        lq         mean    median       uq         max neval cld
 func1(vec)    29.998    36.984     44.78312    42.736    44.38     399.006   100  a 
 func3(vec) 12845.823 13666.432  14452.02863 14060.712 14708.53   25025.950   100  a 
 func2(vec) 84898.055 87354.750 110046.26659 88634.566 91193.38 1042819.269   100   b
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With