停止R程序没有错误

Ali*_*Ali 22 debugging r

有没有办法阻止R程序没有错误?

例如,我有一个很大的来源,定义了几个函数,之后有一些函数调用.碰巧我编辑了一些函数,并希望在R环境中更新函数定义,但实际上并没有调用它们.

我定义了一个变量justUpdate,当它TRUE想要在函数定义之后停止程序时.

ReadInput <- function(...) ...
Analyze <- function(...) ...
WriteOutput <- function(...) ...

if (justUpdate)
    stop()
# main body
x <- ReadInput()
y <- Analyze(x)
WriteOutput(y)
Run Code Online (Sandbox Code Playgroud)

我已调用stop()函数,但问题是它会输出错误消息.

ctrl+ c是另一种选择,但我想在特定行中停止源代码.

有问题q()或者quit()是它终止R对话,但我想有R对话仍处于打开状态.

正如@JoshuaUlrich提出的browser()可以是另一种选择,但仍然不完美,因为源终止于新环境(即R提示将改为Browser[1]>而不是>).我们仍然可以按下Q退出,但我正在寻找直截了当的方式.

另一个选择是使用,if (! justUpdate) { main body }但它正在清除问题,而不是解决它.

还有更好的选择吗?

Van*_*las 11

有一个邮件列表一个很好的解决方案在这里定义了stopQuietly,基本上函数隐藏从显示的错误stop函数:

stopQuietly <- function(...) {
  blankMsg <- sprintf("\r%s\r", paste(rep(" ", getOption("width")-1L), collapse=" "));
  stop(simpleError(blankMsg));
} # stopQuietly()

> stopQuietly()
Run Code Online (Sandbox Code Playgroud)


Sti*_*ibu 8

我发现了一个相当巧妙的解决办法在这里.诀窍是在调用之前关闭所有错误消息stop().该函数on.exit()用于确保之后再次打开错误消息.该函数如下所示:

stop_quietly <- function() {
  opt <- options(show.error.messages = FALSE)
  on.exit(options(opt))
  stop()
}
Run Code Online (Sandbox Code Playgroud)

第一行关闭错误消息并将旧设置存储到变量中opt.在此行之后,发生的任何错误都不会输出消息,因此也stop()不会导致打印任何消息.

根据R的帮助,

on.exit 将当前函数退出时作为参数给出的表达式记录为需要执行.

当前函数是stop_quietly(),并在stop()调用时退出.所以该程序所做的最后一件事就是调用options(opt)它将被设置show.error.messages为它之前的值stop_quietly()(可能,但不一定是TRUE).


Jos*_*ich 6

你正在寻找这个功能browser.

  • 谢谢,“浏览器”是一个不错的选择,但并不完美。当我将其放入源代码中时,程序从我想要的行成功停止,但是提示符更改为“Browser[1]&gt;”而不是“&gt;”,这意味着在新环境中。我想要的环境与我的源代码正常完成的环境相同 (2认同)
  • 您是否在寻找`break`? (2认同)

xm1*_*xm1 6

我有一个类似的问题,根据@VangelisTasoulas 的回答,我得到了一个简单的解决方案。
在函数内部,我必须检查 DB 是否已更新。如果不是,则停止执行。

r=readline(prompt="Is DB updated?(y/n)")
Is DB updated?(y/n)n
if(r != 'y') stop('\r Update DB')
Update DB
Run Code Online (Sandbox Code Playgroud)

只是放在\r消息的开头,在消息中覆盖Error:


小智 5

您可以使用以下解决方案来停止 R 程序而不会出现错误:

if (justUpdate)
    return(cat(".. Your Message .. "))
Run Code Online (Sandbox Code Playgroud)

  • 欢迎来到SO!这可能会回答这个问题,但是简短的解释和上下文可以帮助每个人理解您的解决方案。 (2认同)