【问题标题】:R: why are the while and for loops different in terms of the accessibility of the loop index/counter from within the loop body?R:为什么在循环体中循环索引/计数器的可访问性方面,while 和 for 循环不同?
【发布时间】:2019-12-23 01:16:37
【问题描述】:

考虑以下 R 中的玩具示例:

#For loop
i <- 1
for(i in 1:10){
  print(i)
  if(i == 5){
    i <- 8
    next
  }
}

#For loop output
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

#While loop
i <- 1
while (i <= 10){
  print(i)
  if(i == 5){
    i <- 8
    next
  }
  i <- i + 1
}

#While loop output
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 8
[1] 9
[1] 10

在上述两个示例中,当循环体内的条件语句被评估为TRUE (if(i == 5)) 时,会尝试更改循环索引/计数器。但是,这似乎只在while 循环中有效,而在for 循环中无效。

为什么会这样?

更具体地说,?controlfor 循环的索引有这样的看法(下面引用中的var):

你可以在循环体中赋值给 var,但这不会 影响下一次迭代。

为什么 for 结构需要这样做,而 while 结构不需要?

【问题讨论】:

    标签: r for-loop while-loop control-flow


    【解决方案1】:

    来自help('for')。我的重点:

    for 循环中的 seq 在循环开始时计算;改变 它随后不会影响循环。如果 seq 的长度为零 循环体被跳过。否则变量var 被赋值 翻转seq的每个元素的值。 您可以分配给var 内 循环体,但这不会影响下一次迭代。 当循环终止时,var 仍然是一个包含它的变量 最新值。

    您发现的是记录在案的行为。

    对于while 循环,在使用之前没有对变量var 进行评估,因为没有要评估的变量。 while 循环可能根本没有计数器,它们取决于一个条件,每次循环到达它时都会进行评估。

    【讨论】:

      【解决方案2】:

      因为for 将遍历输入向量中的每个元素。如果将变量分配给不在输入向量中的值会发生什么? R 中的循环结构与我们习惯的不同,例如C,这是他们做出的实现选择。

      【讨论】:

        猜你喜欢
        • 2020-08-25
        • 2022-01-22
        • 2019-01-13
        • 2011-05-11
        • 1970-01-01
        • 2013-05-11
        • 1970-01-01
        • 1970-01-01
        • 2023-03-02
        相关资源
        最近更新 更多