如果不满足条件,则停止 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
你的脚本。
用例:我在 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
你的脚本。