R函数在向量上使用FOR循环

run*_*el0 4 for-loop r function vector

当然是一个facepalm问题,对不起.我一直在尝试RTFM并谷歌,但没有运气.

我试图在R中创建一个愚蠢的函数,它将一个向量作为参数,使用for循环遍历它,并对每个组件进行非常简单的添加.

func1 <- function(vector) {
  vr <- c() ### an empty vector 

  for (i in 1:length(vector)) { 
    vr <- vector[i]+i
  }
}
Run Code Online (Sandbox Code Playgroud)

对我来说,这看起来是正确的,但我总是得到一个NULL向量.为什么?

cde*_*man 10

你可以像这样写得更有效率:

func1 <- function(vector){
    vector + seq_along(vector)
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以利用矢量加法了.

为了完整起见,让我们对这两个解决方案进行基准测试.这是一般循环解决方案:

func2 <- function(vector) {
    vr <- c() ### an empty vector 

    for (i in 1:length(vector)) { 
        vr[i] <- vector[i]+i
    }
    vr
}
Run Code Online (Sandbox Code Playgroud)

作为一个进步,还有就地解决方案

func3 <- function(vector) {    
    for (i in 1:length(vector)) { 
        vector[i] <- vector[i]+i
    }
    vector
}
Run Code Online (Sandbox Code Playgroud)

使用microbenchmark我们可以看到矢量化解决方案是迄今为止最有效的.

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
Run Code Online (Sandbox Code Playgroud)


Cur*_* F. 5

您的代码很接近,但有两个问题。首先,除非通过return()调用指定,否则 R 中的函数将返回最后一个表达式。在你的函数中,这是 for 循环本身。但 for 循环表达式本身不返回任何内容。

其次,最后一行没有对 进行索引vr,因此您将使用循环中的最后一个结果完全覆盖它。

因此,这段代码(我认为)会做你想做的事。但同意另一个答案,即有更简单的方法可以做到这一点。

func1 <- function(vector) {
  vr <- c() ### an empty vector 

  for (i in 1:length(vector)) { 
    vr[i] <- vector[i]+i
  }
  vr
}
Run Code Online (Sandbox Code Playgroud)

这给出了这个输出:

> func1(c(1,2))
[1] 2 4
Run Code Online (Sandbox Code Playgroud)

  • 好答案。也就是说,这不是您通常在 R 中编写的方式。 (2认同)