【问题标题】:How to jump to next top level loop?如何跳转到下一个顶级循环?
【发布时间】:2012-06-02 22:56:42
【问题描述】:

我有一个 for 循环嵌套在另一个 for 循环中。我怎样才能做到在内循环中发生某些事情时,我们退出并跳转到外循环的下一次迭代?

uuu <- 0

for (i in 1:100) {
    uuu <- uuu + 1
    j <- 1000
    for (eee in 1:30) {
        j <- j - 1
        if (j < 990) {
            # if j is smaller than 990 I hope start next time of i
        }
    }
}

【问题讨论】:

  • 见:nextbreak,但在这里我宁愿有一个内部循环,如:for (j in 1000:970) {...}

标签: r loops nested-loops


【解决方案1】:

@flodel 对此有正确的答案,即使用break 而不是next。不幸的是,无论使用哪种控制流构造,该答案中的示例都会给出相同的结果。

我添加以下示例只是为了说明这两个构造的行为有何不同。

## Using `break`
for (i in 1:3) {
   for (j in 3:1) {     ## j is iterated in descending order
      if ((i+j) > 4) {
         break          ## << Only line that differs
      } else {
         cat(sprintf("i=%d, j=%d\n", i, j))
      }}}
# i=1, j=3
# i=1, j=2
# i=1, j=1

## Using `next`
for (i in 1:3) {
   for (j in 3:1) {     ## j is iterated in descending order
      if ((i+j) > 4) {
         next           ## << Only line that differs
      } else {
         cat(sprintf("i=%d, j=%d\n", i, j))
      }}}
# i=1, j=3
# i=1, j=2
# i=1, j=1
# i=2, j=2   ##  << Here is where the results differ
# i=2, j=1   ##
# i=3, j=1   ##

【讨论】:

    【解决方案2】:

    我认为您想使用 break,因此 R 将停止循环通过您的内部 for 循环,因此继续您的外部 for 循环的下一次迭代:

    for (i in 1:10) {
       for (j in 1:10) {
          if ((i+j) > 5) {
             # stop looping over j
             break
          } else {
             # do something
             cat(sprintf("i=%d, j=%d\n", i, j))
          }
       }
    }
    # i=1, j=1
    # i=1, j=2
    # i=1, j=3
    # i=1, j=4
    # i=2, j=1
    # i=2, j=2
    # i=2, j=3
    # i=3, j=1
    # i=3, j=2
    # i=4, j=1
    

    【讨论】:

    • +1 - 我同意这是对 OP 问题的正确答案。我自己只添加了一个答案 b/c 我希望更好地突出 nextbreak 的不同之处。
    • 也许只是添加一个中断指示器来中断两个循环
    猜你喜欢
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多