打破/退出脚本

我有一个程序,做一些数据分析,是几百行。

在程序的早期阶段,我想做一些质量控制,如果没有足够的数据,我想程序终止并返回到R控制台。 否则,我想要执行其余的代码。

我已经尝试了breakbrowserquit并且没有一个人停止执行其余的程序(并quit停止执行以及完全退出R,这不是我想要发生的事情)。 我最后的办法是创build一个if-else语句如下:

  if(n < 500){} else{*insert rest of program here*} 

但这似乎是不好的编码习惯。 我错过了什么吗?

如果你想程序产生一个错误,你可以使用stopifnot()函数:

 foo <- function(x) { stopifnot(x > 500) # rest of program } 

颠倒你的if-else结构:

 if(n >= 500) { # do stuff } # no need for else 

编辑:似乎OP正在运行一个长的脚本,在这种情况下,只需要包装的质量控制脚本的一部分

 if (n >= 500) { .... long running code here } 

如果抛出一个函数 ,你可能只想显式地或隐式地return()

例如,明确的双重回报

 foo <- function(x) { if(x < 10) { return(NA) } else { xx <- seq_len(x) xx <- cumsum(xx) } xx ## return(xx) is implied here } > foo(5) [1] 0 > foo(10) [1] 1 3 6 10 15 21 28 36 45 55 

通过隐含的return() ,我的意思是最后一行就好像你已经完成了return(xx) ,但是把call改为return()会稍微高效一些。

有的考虑使用多种返回不良风格; 在长时间的函数中,跟踪函数退出的位置会变得困难或容易出错。 因此,另一种方法是有一个返回点,但使用if () else ()子句更改返回对象。 对foo()进行这样的修改foo()

 foo <- function(x) { ## out is NA or cumsum(xx) depending on x out <- if(x < 10) { NA } else { xx <- seq_len(x) cumsum(xx) } out ## return(out) is implied here } > foo(5) [1] NA > foo(10) [1] 1 3 6 10 15 21 28 36 45 55 

不是很漂亮,但是这里是一个在R中实现一个exit()命令的方法。

 exit <- function() { .Internal(.invokeRestart(list(NULL, NULL), NULL)) } print("this is the last message") exit() print("you should not see this") 

只是轻度testing,但是当我运行这个,我看到this is the last message ,然后脚本中止没有任何错误信息。

也许你只是想在某个时候停止执行一个长脚本。 即。 就像你想用C或者Python来编写一个exit()的代码。

 print("this is the last message") stop() print("you should not see this") 

您可以使用R “tools”包中的pskill函数中断当前进程并返回到控制台。 具体来说,我有一个启动文件中定义的以下函数,我在每个脚本的开始处提供这些函数。 但是,您也可以直接在代码的开头复制它。 然后在代码中的任何一点插入halt()来停止脚本执行。 这个函数在GNU / Linux上运行良好,从R文档判断,它也应该在Windows上工作(但我没有检查)。

 # halt: interrupts the current R process; a short iddle time prevents R from # outputting further results before the SIGINT (= Ctrl-C) signal is received halt <- function(hint = "Process stopped.\n") { writeLines(hint) require(tools, quietly = TRUE) processId <- Sys.getpid() pskill(processId, SIGINT) iddleTime <- 1.00 Sys.sleep(iddleTime) } 

这里:

 if(n < 500) { # quit() # or # stop("this is some message") } else { *insert rest of program here* } 

quit()和stop(message)都会退出你的脚本。 如果从R命令提示符处获取脚本,则quit()也将退出R。