在RStudio/Interactive R会话中发生错误时停止执行
在RStudio中执行代码块时,当出现错误时,执行实际上不会停止。例如,如果我在open editor中有以下代码:在RStudio/Interactive R会话中发生错误时停止执行,r,unit-testing,testing,rstudio,R,Unit Testing,Testing,Rstudio,在RStudio中执行代码块时,当出现错误时,执行实际上不会停止。例如,如果我在open editor中有以下代码: x <- 'test' stopifnot(is.numeric(x)) print('hello world') x当您选择一个部分并按Ctrl+Enter键时,我认为没有办法阻止RStudio运行所有行。Rstudio只是一行接一行地运行。即使在函数内部调用了stopifnot(),该函数调用之后的所有行仍将被求值 如果您的目标只是在出现错误时得到通知,在大量代码无效
x <- 'test'
stopifnot(is.numeric(x))
print('hello world')
x当您选择一个部分并按Ctrl+Enter键时,我认为没有办法阻止RStudio运行所有行。Rstudio只是一行接一行地运行。即使在函数内部调用了stopifnot()
,该函数调用之后的所有行仍将被求值
如果您的目标只是在出现错误时得到通知,在大量代码无效运行之前,您可以定义一个类似于stopifnot()
的函数,如果出现错误,该函数将进入无限循环。然后,您可以按Esc
或RStudio中的停止按钮来中断程序。大概是这样的:
waitifnot <- function(cond) {
if (!cond) {
message(deparse(substitute(cond)), " is not TRUE")
while (TRUE) {}
}
}
waitifnot <- function(cond) {
if (!cond) {
msg <- paste(deparse(substitute(cond)), "is not TRUE")
if (interactive()) {
message(msg)
while (TRUE) {}
} else {
stop(msg)
}
}
}
只有在交互模式下运行时,此函数才会进入无止境循环。否则,它将通过调用
stop()
中止执行。我已经检查过,使用Ctrl+Enter或RStudio(无止境循环)中的Source按钮以及Bash命令行上的Rscript
(程序中止)时,这是否能按预期工作。如@lmo所述,您只需点击按钮Source
,而不是选择all+Run
。事实上,您甚至不需要保存脚本文件就可以点击Source
按钮
但问题确实是
Source
将始终运行整个脚本。因此,如果您真的只想在脚本中运行一个块,这对您没有任何帮助。如果您将其作为源文件执行,那么它将按您希望的方式工作。例如,如果您将3行代码复制并粘贴到控制台中,然后按Enter键,那么它将分别运行每一行代码。第二种模式很可能是“运行”按钮的操作模式。@lmo谢谢——问题是我认识的大多数人都是以交互方式运行该程序的。我正试图为社会科学家编写一个教程,让他们在代码中加入测试,并需要在代码所在的地方进行测试。总是有tryCatch
和try
。感谢@Dason的评论,我刚刚想到了一个技巧:{/code>R会像执行单个命令一样执行代码块,“然后你就会得到你想要的结果。”Dason在数据科学中经常提到这个问题。人们有很长的数据清理和组织脚本,并希望添加完整性检查,以确保在某一时刻更改内容时,不会在其他地方损坏数据。只需进行少量检查,以确保观察的数量仍然正确,或者唯一标识符仍然是唯一的。
waitifnot <- function(cond) {
if (!cond) {
msg <- paste(deparse(substitute(cond)), "is not TRUE")
if (interactive()) {
message(msg)
while (TRUE) {}
} else {
stop(msg)
}
}
}