【问题标题】:Iterating over a changing sequence in a for loop在 for 循环中迭代变化的序列
【发布时间】:2022-01-03 19:39:06
【问题描述】:

假设我们的语法如下:

for (i in sequence) {
  ...
  sequence <- append(sequence, i, after = 3)
}

但代码似乎无法正常工作,因为sequence 没有在括号内更新。我已经使用while 循环提出了类似的决定。是否可以使用for 循环?

【问题讨论】:

  • sequencefor 循环之前的内容是什么?
  • @stefan_aus_hannover 类似于3 5 9 7 1(n 元素的随机奇数行)

标签: r for-loop


【解决方案1】:

R 中的for 循环仅在开头评估seq 值(在您的示例中为sequence)。因此,在循环中更改 sequence 不会影响循环运行的次数。

例如,

sequence <- 1:2
for (i in sequence) {
  print(i)
  sequence <- 0
}

将打印数字 1 和 2,然后完成,sequence 包含一个零。

这在帮助页面?"for"中有描述:

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

【讨论】:

    【解决方案2】:

    不,R 中的 for 循环可以被视为“按值”迭代输入的函数调用(例如,通过复制输入)。 start 后对迭代器序列的任何更改都不会影响 for 循环迭代。这通常是良好实践,因为它大大减少了不良编码实践和无限循环。这很容易用一个简单的例子来说明:

    idx <- 1:15
    for(i in idx){
      idx <- head(idx, -1)
      cat('idx: ', idx, '\n')
      cat('i: ', i, '\n')
    }
    

    如果您想更新迭代器,最好的选择是 repeatwhile,但要小心,因为这会增加错误和意外无限循环的可能性。

    idx <- 1:15
    while(length(idx) != 0){
      i <- head(idx, 1)
      idx <- tail(idx, -1)
      cat('idx: ', idx, '\n')
      cat('i: ', i, '\n')
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多