有没有办法阻止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)
我发现了一个相当巧妙的解决办法在这里.诀窍是在调用之前关闭所有错误消息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
).
你正在寻找这个功能browser
.
我有一个类似的问题,根据@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)