而TRUE +在子环境中中断

时间:2016-03-23 15:40:00

标签: r while-loop break

我无法使import java.util.ArrayList; import java.util.regex.*; public String getString(String input, int i, int j){ ArrayList <String> list = new ArrayList <String> (); Matcher m = Pattern.compile("(\"[^\"]+\")").matcher(input); while (m.find()) { list.add(m.group(1)); } return list.get(i - 1) + list.get(j - 1); } 循环工作。我认为这个例子解决了问题的关键:

String input = "\"Bruce Wayne\" \"43\" \"male\" \"Gotham\"";
String res = getString(input, 1, 3);
System.out.println(res);

哪个运行错误:

  

"Bruce Wayne""male" 中的错误:

     

没有循环中断/下一步,跳到顶级

奇怪的是,while(TRUE)循环似乎已成功执行:

l <- list(x = 5)

while (TRUE){
  with(l, if (x > 100) break else l$x <<- x + 5)
}

看来问题是我在子环境中发送eval(expr, envir, enclos)语句,因为以下按预期工作而没有错误:

while

认为这只是一个环境问题,我也尝试用l # $x # [1] 105 break替换x = 5 while(TRUE){ if (x > 100) break else x <<- x+5 } ,但无济于事。

如何停止此错误?

我认为break可能是相关的:

eval(break, parent.env())

2 个答案:

答案 0 :(得分:3)

@ Vongo建议的一个变体是使用environment()捕获应该进行评估的环境,然后使用evalq()在正确的位置评估break

l <- list(x = 5)
while (TRUE){
    env <- environment()
    with(l, if (x > 100) evalq(break, env) else l$x <<- x + 5)
}

这可以避免解析文本字符串,并且因此看起来不那么hacky。在捕获的环境中进行评估env允许循环处于R代码中的任何级别,而不仅仅是.GlobalEnv。这就像非局部跳转(又称GOTO),这使得更难以推断代码。

答案 1 :(得分:1)

也许我不明白问题的所有利害关系,但你可以试试:

l <- list(x = 5)
while (TRUE){
  with(l, if (x > 100) eval(parse(text="break"), envir=.GlobalEnv) else l$x <<- x + 5)
}