有没有办法在没有错误的情况下停止R程序?
例如,我有一个很大的来源,定义了几个函数,然后有一些函数调用。碰巧我编辑了一些函数,并希望在R环境中更新函数定义,但实际上并没有调用它们。
我定义了一个变量justUpdate
,当TRUE
想要在函数定义之后停止程序时。
ReadInput <- function(...) ...
Analyze <- function(...) ...
WriteOutput <- function(...) ...
if (justUpdate)
stop()
# main body
x <- ReadInput()
y <- Analyze(x)
WriteOutput(y)
我调用了stop()
函数,但问题是它会输出错误信息。
ctrl + c 是另一种选择,但我想在特定行停止源。
q()
或quit()
的问题在于它终止了R会话,但我希望R会话仍然打开。
由于@JoshuaUlrich建议browser()
可以是另一种选择,但仍然不完美,因为源终止于新环境(即R提示将更改为Browser[1]>
而不是>
)。我们仍然可以按Q
退出,但我正在寻找直截了当的方式。
另一个选择是使用if (! justUpdate) { main body }
,但它正在解决问题,而不是解决问题。
还有更好的选择吗?
答案 0 :(得分:9)
邮件列表here中有一个很好的解决方案,它定义了stopQuietly
函数,它基本上隐藏 stop
函数显示的错误:
stopQuietly <- function(...) {
blankMsg <- sprintf("\r%s\r", paste(rep(" ", getOption("width")-1L), collapse=" "));
stop(simpleError(blankMsg));
} # stopQuietly()
> stopQuietly()
答案 1 :(得分:8)
我找到了一个相当简洁的解决方案here。诀窍是在调用stop()
之前关闭所有错误消息。函数on.exit()
用于确保之后再次打开错误消息。该函数如下所示:
stop_quietly <- function() {
opt <- options(show.error.messages = FALSE)
on.exit(options(opt))
stop()
}
第一行关闭错误消息并将旧设置存储到变量opt
。在此行之后,发生的任何错误都不会输出消息,因此stop()
也不会导致打印任何消息。
根据R帮助,
on.exit
将给出的表达式记录为当前函数退出时需要执行的参数。
当前函数为stop_quietly()
,并在调用stop()
时退出。所以程序执行的最后一件事是调用options(opt)
,在调用show.error.messages
之前将stop_quietly()
设置为它所拥有的值(可能,但不一定是TRUE
)
答案 2 :(得分:6)
您正在寻找功能browser
。
答案 3 :(得分:3)
我有类似的问题,根据@VangelisTasoulas的回答,我得到了一个简单的解决方案。
在内部函数中,我必须检查DB是否已更新。如果不是,请停止执行。
;; initial window
(setq initial-frame-alist
'((width . 202) ; character
(height . 60) ; lines
))
;; default/subsequent window
(setq default-frame-alist
'((width . 202) ; character
(height . 60) ; lines
))
只需将r=readline(prompt="Is DB updated?(y/n)")
Is DB updated?(y/n)n
if(r != 'y') stop('\r Update DB')
Update DB
放在邮件的开头,就会在邮件中覆盖\r
。
答案 4 :(得分:1)
只需return
行中要退出该函数的内容:
f <- function(x, dry=F) {
message("hi1")
if (dry) return(x)
message("hi2")
x <- 2*x
}
y1 <- f(2) # = 4 hi1 hi2
y2 <- f(2, dry=T) # = 2 hi1
答案 5 :(得分:0)
您可以使用以下解决方案来正确停止R程序:
if (justUpdate)
return(cat(".. Your Message .. "))
答案 6 :(得分:0)
只需quit()
在要退出代码的位置即可。它悄悄发生。
答案 7 :(得分:0)
为什么不只使用if(){} else {}?只是几个字符而已...
f1 <- function(){}
f2 <- function(){}
if (justUpdate) {
} else {
# main body
}
甚至
f1 <- function(){}
f2 <- function(){}
if (!justUpdate) {
# main body
}
答案 8 :(得分:0)
除了在17年3月22日7:29收到Stibu的答复外,如果您想将消息写为stop()的一部分,则不会写此消息。
我觉得很奇怪,必须使用以下两行表示on.exit(options(options(show ....)))不起作用。
opt <- options(show.error.messages = F)
on.exit(options(opt))
答案 9 :(得分:-1)
下面的代码对我有用,已停止,没有错误消息。
opt <- options(show.error.messages = FALSE)
on.exit(options(opt))
break