我在代码中使用数据检查,例如以下内容:
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
答案 0 :(得分:6)
根据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
答案 1 :(得分:0)
如果我理解正确,似乎不是R的默认行为。
所以我认为停止处理程序有一些变化。在运行代码之前,您可以尝试调用options(stop=NULL)
。见the doc:
交互式使用中的默认行为(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()