为什么在任何内容上运行for循环时R只保存最后的结果?

时间:2018-06-22 17:29:29

标签: r

test <- c(0,1,2,3,4,4,4)
for(i in test) {
   savethis <- c(i)
}
print(savethis)

无论我尝试什么,这总是输出4。我想将所有向量值保存到savethis中。

1 个答案:

答案 0 :(得分:3)

我假设您不想复制向量test。如果没有,基本上可以使用两种方式使用for循环来完成所需的工作。

一个(如果您知道输出的大小)。

例如,如果您知道输出的大小与输入的大小相同,则可以事先创建输出向量,然后在循环中使用标准索引分配值。

test <- c(0, 1, 2, 3, 4, 4, 4)

savethis <- numeric(length(test))    # Do this outside the loop

for(i in seq_along(test)) {
   savethis[i] <- test[i]
}
print(savethis)

另一个(如果您不知道输出的大小)。

在这种情况下,您应该在循环外创建一个长度为零的向量,并在循环内扩展该向量

savethis <- NULL

for(i in test) {
   savethis <- c(savethis, i)
}
print(savethis)

或者像上面的第一个示例一样,使用test的索引。

savethis <- NULL

for(i in seq_along(test)) {
   savethis[i] <- test[i]
}
print(savethis)

请注意,尽管此循环使用与第一个完全相同的指令,但它的工作方式完全不同。循环length(savethis)之前为零。因此,值savethis[1]不存在,它是在循环中第一次创建的,然后是savethis[2],等等。

如果您知道输出的大小,则上面的第一个示例始终是最好的。另外两个迫使R反复调用内存管理例程,这浪费了处理时间。