在向量上使用 FOR 循环的 R 函数
R function with FOR loop on a vector
抱歉,这肯定是一个面子问题。我一直在尝试 RTFM 和 google 但没有成功。
我正在尝试在 R 中创建一个愚蠢的函数,它将一个向量作为参数,使用 for 循环遍历它并对每个组件进行非常简单的加法。
func1 <- function(vector) {
vr <- c() ### an empty vector
for (i in 1:length(vector)) {
vr <- vector[i]+i
}
}
对我来说这看起来是正确的,但我总是得到一个 NULL 向量。为什么?
您可以像这样更有效地编写:
func1 <- function(vector){
vector + seq_along(vector)
}
这样您就可以利用矢量加法了。
为了完整起见,让我们对这两个解决方案进行基准测试。这是一般的循环解决方案:
func2 <- function(vector) {
vr <- c() ### an empty vector
for (i in 1:length(vector)) {
vr[i] <- vector[i]+i
}
vr
}
作为升级,还有就地解决方案
func3 <- function(vector) {
for (i in 1:length(vector)) {
vector[i] <- vector[i]+i
}
vector
}
使用 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
您的代码很接近,但有两个问题。首先,除非用 return()
调用指定,否则在 R return 最后一个表达式中起作用。在您的函数中,这是 for 循环本身。但是 for 循环表达式 return 本身什么也不是。
其次,最后一行未在 vr
上建立索引,因此您将用循环中的最后结果完全覆盖它。
因此,这段代码(我认为)会做你想做的事。但同意其他答案,有更简单的方法可以做到这一点。
func1 <- function(vector) {
vr <- c() ### an empty vector
for (i in 1:length(vector)) {
vr[i] <- vector[i]+i
}
vr
}
这给出了这个输出:
> func1(c(1,2))
[1] 2 4
抱歉,这肯定是一个面子问题。我一直在尝试 RTFM 和 google 但没有成功。
我正在尝试在 R 中创建一个愚蠢的函数,它将一个向量作为参数,使用 for 循环遍历它并对每个组件进行非常简单的加法。
func1 <- function(vector) {
vr <- c() ### an empty vector
for (i in 1:length(vector)) {
vr <- vector[i]+i
}
}
对我来说这看起来是正确的,但我总是得到一个 NULL 向量。为什么?
您可以像这样更有效地编写:
func1 <- function(vector){
vector + seq_along(vector)
}
这样您就可以利用矢量加法了。
为了完整起见,让我们对这两个解决方案进行基准测试。这是一般的循环解决方案:
func2 <- function(vector) {
vr <- c() ### an empty vector
for (i in 1:length(vector)) {
vr[i] <- vector[i]+i
}
vr
}
作为升级,还有就地解决方案
func3 <- function(vector) {
for (i in 1:length(vector)) {
vector[i] <- vector[i]+i
}
vector
}
使用 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
您的代码很接近,但有两个问题。首先,除非用 return()
调用指定,否则在 R return 最后一个表达式中起作用。在您的函数中,这是 for 循环本身。但是 for 循环表达式 return 本身什么也不是。
其次,最后一行未在 vr
上建立索引,因此您将用循环中的最后结果完全覆盖它。
因此,这段代码(我认为)会做你想做的事。但同意其他答案,有更简单的方法可以做到这一点。
func1 <- function(vector) {
vr <- c() ### an empty vector
for (i in 1:length(vector)) {
vr[i] <- vector[i]+i
}
vr
}
这给出了这个输出:
> func1(c(1,2))
[1] 2 4