我对R来说比较新,对于循环我有点困惑。
我尝试在命中条件命中后在for循环中重复几个步骤。我试图把循环放回一步,但已经认识到循环不断计数并忽略我的命令。这是一个简单的例子来说明我的意思:
a <- 1:10
b <- rep(NA, 15)
fun <- function(){
i <- 1
for(i in 1:10){
b[i] <- a[i]
i <- i - 1 # This is the line I am talking about.
}
return(b)
}
fun()
[1] 1 2 3 4 5 6 7 8 9 10 NA NA NA NA NA
我原以为这段代码会永远运行,只分配1代。有没有办法如何在for循环中向后退一步或者我必须采取完全不同的方法?
提前多多感谢!
答案 0 :(得分:6)
for循环的工作方式是,如果你有for (i in 1:10)
,则首先将i
设置为1,然后执行循环体。然后我们回到顶部并将i
设置为2,然后再次执行循环体。基本上,这个循环:
for (x in 1:3) {
print(x^2)
}
等同于此代码:
x = 1
print(x^2)
x = 2
print(x^2)
x = 3
print(x^2)
因此,您尝试通过更改i
将循环回滚一步是行不通的,因为for
循环实际上并不监视i
是什么,它只是运行正文对于原始1:10
序列的每个元素,循环一次。
如果您希望有时重复一个步骤,则应使用while
循环并手动增加i
:
a <- 1:10
b <- rep(NA, 15)
i <- 1
while (i <= 10) {
b[i] <- a[i]
# Flip a coin, don't move on if it comes up tails
# Replace this test with the relevant condition you
# want to check for
if (sample(c(0, 1), 1) == 1) {
i <- i + 1
} else {
print(paste("Repeating with i =", i))
}
}