这可能是一个很低级的问题,抱歉。我一直在努力阅读文档并搜索,但没有结果。
我正在尝试在R中创建一个简单的函数,该函数将向量作为参数,使用for循环遍历它并对每个元素进行简单的加法操作。
func1 <- function(vector) {
vr <- c() ### an empty vector
for (i in 1:length(vector)) {
vr <- vector[i]+i
}
}
对我来说,这看起来是正确的,但我总是得到一个空向量。为什么?
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中的函数会返回最后一个表达式。在您的函数中,这是for循环自身。但是,for循环表达式本身不返回任何内容。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
for
循环中删除vr <- c()
和vr <- vector[i]+i
,并将vector[i] <- vector[i] + 1
放入其中。别忘了在函数末尾返回对象 (return(vector)
或者只是vector
)。 - nrussell