非常简单的示例代码(仅用于演示,完全没用):
repeat {
while (1 > 0) {
for (i in seq(1, 100)) {
break # usually tied to a condition
}
break
}
break
}
print("finished")
我希望分别在每个循环中不使用break
从多个循环中分离出来。
根据{{3}},将我的循环包装到函数中似乎是一种可能的解决方案,即使用return()
来打破函数中的每个循环:
nestedLoop <- function() {
repeat {
while (1 > 0) {
for (i in seq(1, 100)) {
return()
}
}
}
}
nestedLoop()
print("finished")
R中是否还有其他方法?也许类似于标记循环,然后指定要中断的循环(如在Java中)?
答案 0 :(得分:8)
使用显式标志,并在这些标志上有条件地断开循环可以提供更多的灵活性。例如:
jq '.[] | select(.fields.cartItemId == 2081021134)' input.json
上面的代码将在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
的情况。这种结构易于使用,并且可以根据需要灵活使用。
答案 1 :(得分:1)
我认为将嵌套循环包装到函数中的方法是最干净且可能最好的方法。您可以在全局环境中实际调用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)