如果不满足条件,则停止 R 脚本(运行 交互)

Halt R script (run interactively) if a condition is not met

用例:我在 RStudio 中进行交互式数据分析,即我突出显示一堆代码并点击 运行。有时,即使我的代码仍然 运行 正常,但某些情况会使我的分析在统计上无效。在这些情况下,我想停止代码或抛出一些非常疯狂的错误。

最小工作示例:

stopifnot(TRUE, FALSE)
x <- 42

如果我突出显示这两行 运行,42 仍然分配给 x那很糟糕——我不想要 stopifnot(TRUE, FALSE) 到 运行 之后的任何行(因为它们在统计上是无效的,而在编程上是好的)。如果不满足条件,有没有办法完全停止代码?

你的意思是这样的;

x <- 42
if (x == 42) stop("X is 42"); x <- 43

?结果将是 x == 42 并且你得到一个错误

核选项将是终止 session。这将退出或重新启动 Rstudio。

y <- 2
if (y ==2) quit(save="ask")
x <- 42

save="ask"选项会弹出一个提示,回答"no"将继续杀死session。在 Rstudio 中测试,session 终止并重新启动。

更好的选择是将您的分析包装在具有退出策略的函数调用中

doAnalysis <- function() {

   ...

   stopifnot(TRUE, FALSE)

   ...


}
doAnalysis()

如果您需要在此函数调用期间生成间歇性变量,您可以使用

将它们放入 Global 环境中
y <<- 2

我的解决方案是将代码括在括号中:

{
  stopifnot(TRUE, FALSE)
  x <- 42
}

来自?options

options(error = utils::recover)

stopifnot(TRUE, FALSE)
x <- 43

当运行交互时,returns:

options(error = utils::recover)

stopifnot(TRUE, FALSE)

Error: FALSE is not TRUE

Enter a frame number, or 0 to exit   

1: stopifnot(TRUE, FALSE)

Selection: x <- 43
Enter an item from the menu, or 0 to exit
Selection: 

命中后0:

> x
Error: object 'x' not found
No suitable frames for recover()

请注意,这是一个相当激烈的反应(您似乎希望如此)。此外,这些行仍然是 运行,但没有效果。这意味着如果您 运行 编写了大量代码,可能很难找到原始错误。最好的方法是离开 options(error = NULL)source 你的脚本。