我认为无法防止RStudio在选择一个部分并按下Ctrl+Enter时运行所有行。RStudio只是逐行运行。即使在函数内调用stopifnot()
,该函数调用后的所有行仍将被评估。
如果您的目标只是在很多代码无效运行之前获得有关错误的信息,也许您可以定义一个类似于stopifnot()
的函数,它将在出现错误时进入无限循环。然后,您可以按下Esc
或RStudio中的停止按钮来中断程序。类似这样:
waitifnot <- function(cond) {
if (!cond) {
message(deparse(substitute(cond)), " is not TRUE")
while (TRUE) {}
}
}
现在,您可以使用此函数运行示例代码:
x <- 'test'
waitifnot(is.numeric(x))
print('hello world')
正如预期的那样,
hello world
从未被打印。您将收到一条错误消息,告诉您出了什么问题,然后程序将等待您手动中止它。
这在除交互模式以外的任何情况下都不起作用。为避免不愉快的情况,您还可以让函数在非交互模式下有所不同的反应,例如像这样:
waitifnot <- function(cond) {
if (!cond) {
msg <- paste(deparse(substitute(cond)), "is not TRUE")
if (interactive()) {
message(msg)
while (TRUE) {}
} else {
stop(msg)
}
}
}
如果在交互模式下运行,此函数将进入无限循环。否则,它将通过调用stop()
来简单地终止执行。我已经检查了在RStudio中使用Ctrl+Enter或Source按钮时(无限循环),以及在Bash命令行上使用Rscript
时(程序终止)这种方式按预期工作。
tryCatch
和try
。 - lmo{}
把代码包起来,R会将整个块作为单个命令执行,这样你就能得到你想要的结果。 - lmo