1

这已经困扰我一段时间了。想象一下,您必须/想要使用循环。

如果你写了一个循环,但你想从数字 2 开始,你会使用以下代码:

for (i in 2:length(variable1) { ... }

当您尝试分配如下值时会出现问题:

variable2 <- 1:length(variable1)
for (i in 2:length(variable1) {
    variable2[i] <- sample(variable1, 1)  # silly example; ignore it content-wise
}

现在,无论您是否要初始化一个较小的向量,获得的变量 2 通常都会有问题,因为它在第一个位置有一个“1”。当您想从更高的数字开始时,处理 for 循环的最简单方法是什么?有没有比使用更好的方法i <- i+i,因为我们还必须让它从 1 运行到 length(variable1) - 1。我错过了一个简单的解决方案吗?

当我这样做时,在for循环之前预定义变量的最佳方法是什么?我通常使用variable2 <- 1:length(variable1), 当我知道 variable2 应该是一个长度为variable1. 这是分配内存的最快方法吗?

编辑:我刚刚意识到这可能是最容易做到的:

variable2 <- 2:length(variable1)
for (i in 2:length(variable1) {
    variable2[i-1]
}

但我仍然愿意接受更好的建议。

4

3 回答 3

3

不要硬编码开始索引。

from <- 2
to <- length(variable) 
for (i in from:to) { 
  variable2[i - from + 1] <- sample(variable1, 1)
} 

或者,如果您发现这更具表现力

offset <- 1
to <- length(variable) 
for(i in (offset + 1):to) { 
  variable2[i-offset] <- sample(variable1, 1)
}
于 2013-05-02T19:44:32.313 回答
3

Themel的回答效果很好。

更一般地,您可以在迭代时使用几乎任何序列。所以我们可以

names <- c("Alice", "Bob", "Eve")
for(i in names) {
  print(i)
}

或者

names <- c("Alice", "Bob", "Eve")
for(i in seq_along(names)) {
  print(names[i])
}

请参阅?seq_along有关这方面的方便入门。seq_along()很好,因为如果您想遍历整个数组,它比自己指定数组边界更安全一些。

您可以通过任意序列进行迭代,例如for(i in c(3, 5, 12, 47)) { # do stuff }. 如果你太狡猾,你会绊倒自己,但请记住,你有这种灵活性。

在这种情况下,我唯一要改变的是避免为结尾创建一个变量,除非你打算让它不是向量的长度。所以:

from <- 2
for (i in from:length(variable)) { 
  variable2[i - from + 1] <- sample(variable1, 1)
} 

在 R 中循环还有很多方法,有时(尽管并非总是如此)探索这些方法很有价值。

于 2013-05-02T20:14:51.877 回答
2

好吧,通常的 R 习惯用法可能是使用sapply并让它处理填充结果向量的簿记。像这样的东西:

> sapply(2:5, function(x) {x*10})
[1] 20 30 40 50
于 2013-05-02T20:46:05.143 回答