打破 R 中的嵌套循环

Breaking out of nested loops in R

非常简单的示例代码(仅用于演示,完全没有用):

repeat {
  while (1 > 0) {
    for (i in seq(1, 100)) {
      break # usually tied to a condition
    }
    break
  }
  break
}
print("finished")

我想跳出多个循环,而不是在每个循环中分别使用 break。 根据 a similar question regarding python,将我的循环包装到一个函数中似乎是一个可能的解决方案,即使用 return() 来跳出函数中的每个循环:

nestedLoop <- function() {
  repeat {
    while (1 > 0) {
      for (i in seq(1, 100)) {
        return()
      }
    }
  }
}

nestedLoop()
print("finished")

R 中还有其他可用的方法吗?也许类似于标记循环然后指定要中断的循环(如 Java)?

我认为您将嵌套循环包装到函数中的方法是最干净的,可能也是最好的方法。你 可以 实际上在全局环境中调用 return(),但是它会抛出一个错误并且看起来很丑,像这样:

for (i in 1:10) {
  for (a in 1:10) {
    for(b in 1:10) {

      if (i == 5 & a == 7 & b == 2) { return() }

    }
  }
}

print(i)
print(a)
print(b)

在命令行中看起来像这样:

> for (i in 1:10) {
+   for (a in 1:10) {
+     for(b in 1:10) {
+       
+       if (i == 5 & a == 7 & b == 2) { return() }
+       
+     }
+   }
+ }
Error: no function to return from, jumping to top level
> 
> print(i)
[1] 5
> print(a)
[1] 7
> print(b)
[1] 2

显然使用函数方法更好更简洁。

编辑:

添加了一个替代解决方案,使 Roland 给出的错误看起来更好:

for (i in 1:10) {
  for (a in 1:10) {
    for(b in 1:10) {

      if (i == 5 & a == 7 & b == 2) { stop("Let's break out!") }

    }
  }
}

print(i)
print(a)
print(b)

使用显式标志并根据这些标志有条件地跳出循环可以提供更多的灵活性。示例:

stop = FALSE
for (i in c(1,2,3,4)){
    for (j in c(7,8,9)){
        print(i)
        print(j)
        if (i==3){
            stop = TRUE # Fire the flag, and break the inner loop
            break
        }
        }
    if (stop){break} # Break the outer loop when the flag is fired
    }

以上代码将在 i=3 时打破两个嵌套循环。当最后一行 (if (stop){break}) 被注释掉时,只有内循环在 i=3 处中断,但外循环保持 运行,即它实际上跳过了 [=11] 的情况=].这种结构很容易玩,而且非常灵活。