R语言for循环内修改索引变量未生效的原因是什么?
R语言for循环修改索引变量不生效的原因
你使用的测试代码如下:
for(i in 1:5){ print(i) i = i + 1 }
实际运行输出为:
[1] 1 [1] 2 [1] 3 [1] 4 [1] 5
出现该行为的核心原因是R的for循环运行机制和很多C类语言不同:
- R的for循环的迭代序列会在循环启动前一次性预先生成,你写的
for(i in 1:5)会先构造好固定向量c(1,2,3,4,5),后续循环只会按顺序从这个预生成的向量里取值赋值给索引变量i,完全不受循环内部对i的修改影响。 - 你在循环内执行的
i = i + 1确实会修改当前轮次内i的取值,但这个修改仅在当前轮次的循环体内有效,进入下一轮循环时,i会被直接覆盖为预生成序列的下一个值,上一轮的修改会被直接丢弃。
具象的执行过程如下:
- 第一轮循环:取预生成序列第1个值
1赋值给i,执行print(i)输出1,执行i = i+1把i修改为2,当前轮次结束 - 第二轮循环:直接取预生成序列第2个值
2覆盖i的取值,执行print(i)输出2,执行i = i+1把i修改为3,当前轮次结束 - 后续循环以此类推,直到预生成序列的5个值全部遍历完成,循环直接终止,因此不会出现你预期的1、3、4、5、6的输出结果。
如果需要手动控制迭代变量的增减逻辑,建议改用while循环实现,示例如下:
i <- 1 cnt <- 0 # 共迭代5次,第一次迭代后i+2,其余+1 while(cnt < 5) { print(i) i <- ifelse(cnt == 0, i + 2, i + 1) cnt <- cnt + 1 }
以上代码即可输出你预期的1、3、4、5、6结果。
内容的提问来源于stack exchange,提问作者Daniel De Wet
相关产品推荐
相关产品推荐

