这一直困扰着我一段时间。想象一下,您必须/想要使用循环。
如果您编写循环,但想要从数字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运行到长度(variable1)减1.我错过了一个简单的解决方案吗?
在我看来,在for
循环之前预定义变量的最佳方法是什么?
我通常使用variable2 <- 1:length(variable1)
,当我知道variable2应该是一个长度为variable1
的变量时。这是分配内存的最快方法吗?
variable2 <- 2:length(variable1)
for (i in 2:length(variable1) {
variable2[i-1]
}
但我仍然愿意接受更好的建议。
答案 0 :(得分: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中循环也有很多种方法,有时候(尽管不总是如此),探索这些方法很有价值。
答案 1 :(得分:2)
不要硬编码起始索引。
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)
}
答案 2 :(得分:2)
嗯,通常的习惯用法可能是使用sapply
并让它处理填写结果向量的簿记。像这样:
> sapply(2:5, function(x) {x*10})
[1] 20 30 40 50