停止在R中执行代码

6

我在我的代码中使用数据检查,例如以下代码:

if (...)
stop(paste('Warning: Weights do not sum up to 1')

问题是如果条件为真并且警告出现在控制台中,代码不会停止运行。如果隐藏在长代码中,需要始终向上滚动控制台输出以查看是否出现警告。
有没有一种方法可以告诉R当停止警告出现并且条件为真时中断所有代码?类似BREAK的东西?
我这里没有提供可重现的示例,因为我的代码非常长。
编辑:
这里是一个小示例:
当我执行
a=1+2

if (a==3)
  stop('a equals 3')


b=4

1+1

我想在打印后停止执行

> a=1+2
> 
> if (a==3)
+   stop('a equals 3')
Error: a equals 3

但是 R 执行所有内容,包括最后一部分:
> a=1+2
> 
> if (a==3)
+   stop('a equals 3')
Error: a equals 3
>        
>        
> b=4
> 
> 1+1
[1] 2

6
代码长度很长并不是不制作可重现例子的借口。这不仅有助于那些愿意帮忙的人,而且很多时候你也会在这个过程中找到解决方案。 - Pierre L
2
那么,如果你像这样源代码 stop("foo_error"); print(iris) 并且想要避免回显/评估 print(iris)stop 旨在用于函数中,您可以将代码包装在函数中。例如,fun <- function() {stop("foo_error"); print(iris)}; fun() - Roland
2
你是在执行“全部源代码”或类似操作吗? - sdgfsdh
@Pierre:看到我上面的编辑了吗?你是对的,用一个迷你示例可能更容易些。 - fuji2015
@Roland:我不知道 stop 只应该在函数中使用——也许我需要一个不同的命令来在函数外使用? - fuji2015
2个回答

9
根据stop,它只停止当前表达式的评估。虽然我同意通过函数将您的代码封装到有意义的块中的Roland's comment,但一个快速的解决方法是用花括号包装您所有现有的代码。这将使其在R解析器中显示为单个表达式。
R> # without curly braces
R> x <- 1
R> y <- 2
R> if (x < y)
+   stop("x < y")
Error: x < y
R> print("hello")
[1] "hello"
R>
R> # with curly braces
R> {
+   x <- 1
+   y <- 2
+   if (x < y)
+     stop("x < y")
+   print("hello")
+ }
Error: x < y

嗨,Joshua,感谢你的回答,你的方法只提供了错误消息,但代码仍然完全运行,我们之所以看不到它是因为它在函数内部?! - fuji2015
@fuji2015:不,它没有运行,并且它不在一个函数中。它在一个表达式中,如果调用stop,则跳过表达式的其余部分。 - Joshua Ulrich
我的错误,我看错了下面的帖子。当然,你的回答中没有函数。谢谢! - fuji2015

0

如果我理解正确的话,似乎这不是R的默认行为。

所以我认为停止处理程序有一些变化。您可以尝试在运行代码之前调用options(stop=NULL)。请参见文档

交互使用中的默认行为(NULL错误处理程序)是返回到顶级提示符或顶级浏览器,在非交互使用中(有效地)调用q("no", status = 1, runLast = FALSE)。

至少以下代码在我的情况下有效(R 3.2.1):

funErr <- function() {
    if (TRUE)
        stop("now")

    print("after stop")
}

funCaller <- function() {
    print("before call")

    funErr()

    print("after call")
}


print("before global")

# Also possible to uncomment the following to test the `stop()` 
# inside of `funErr()`
if(TRUE)
    stop("global error")

funCaller()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接