停止R程序没有错误

时间:2013-01-22 22:50:07

标签: r debugging

有没有办法在没有错误的情况下停止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 },但它正在解决问题,而不是解决问题。

还有更好的选择吗?

10 个答案:

答案 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