停止在R中执行代码

时间:2015-10-28 12:53:55

标签: r

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

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

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()