【问题标题】:How to jump to next top level loop如何跳转到下一个顶级循环
【发布时间】:2021-03-30 09:09:20
【问题描述】:

如果条件发生在内部for 循环中,我想break 内部和next 外部。

我可以在break 语句之前的内部创建一个标志,然后在外部进行评估,这是一个愚蠢的例子:

for (i in 1:3) {
  NEXT <- FALSE
  for (j in 1:3) {
    if (j==2 && i==2) { 
      NEXT <- TRUE
      break
    }
  }
  
  if (NEXT) next
  cat("\n", i, " ... some i stuff ...")
}

有没有优雅的方法来做到这一点?比如:

for (i in 1:3) {
  for (j in 1:3) {
    if (j==2 && i==2) {
      break
      # next (outer)
    }
  }
  cat("\n", i, " ... some i stuff ...")
}

有一个类似/重复的问题,但我认为它没有回答我的问题,因为在问题的外循环中,在内循环之后它什么也不做。

How to jump to next top level loop?

【问题讨论】:

    标签: r for-loop nested-loops


    【解决方案1】:

    快速修复可能是这样的:

    for(i in 1:3){
     for(j in 1:3){
      if(i == 2 && j == 2){
       i <- 3 # can be ignored if you don't want i value changed
       j <- 3 # this will kick it out of the j for loop
       } else {
       ...code...
     }
     cat ....
    }
    

    显然,它并不强大,但似乎可以解决您的问题。

    编辑:

    根据您的评论,也许您正在寻找:

    for(i in 1:3){
     cat.ready <- TRUE
     for(j in 1:3){
      if(i == 2 && j == 2){
       j <- 3 # this will kick it out of the j for loop
       cat.ready <- FALSE
       } else {
        ...code...
     }
     if(cat.ready == TRUE){
      cat(...)
     } else {
     cat.ready <- TRUE
    }
    

    如果ij 都是2,那么这将使您不再执行代码,也不再生成cat(),并在处理该异常后重置条件。

    不过,我确信还有更优雅的解决方案。

    【讨论】:

    • 我觉得这行不通,想要的回复是:1 ... some i stuff ... 2 ... some i stuff ...
    • 也许我当时不明白。我认为这会奏效,不是吗?只要ij 不是2,它仍然会处理代码,并且在处理完j 之后,它会向下移动到嵌套在i 参数下的cat()
    【解决方案2】:

    为什么不反转问题,只在j!=2 &amp;&amp; i!=2时执行内循环?

    for (i in 1:3) {
      for (j in 1:3) {
           cat("\n\ni=",i, " and j=",j )
           if (j!=2 | i!=2 )
           # will be executed unless j is 2 and i is 2
           {
           cat("\n", j, " ... some j stuff ...")
                  }
      }
      cat("\n", i, " ... some i stuff ...")
    }
    

    如果我理解错了,您不想执行 j=2/i=2 和 j=3/i=2 的组合,请相应调整:

    for (i in 1:3) {
      for (j in 1:3) {
           cat("\n\ni=",i, " and j=",j )
           if (j!=2 | i!=2 & i!=3)
           # will be executed unless j is 2 and i is 2 or j is 3 and i is 2
           {
           cat("\n", j, " ... some j stuff ...")
                  }
      }
      cat("\n", i, " ... some i stuff ...")
    }
    

    【讨论】:

      猜你喜欢
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多