在RStudio/Interactive R会话中发生错误时停止执行

在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(),该函数调用之后的所有行仍将被求值 如果您的目标只是在出现错误时得到通知,在大量代码无效

在RStudio中执行代码块时,当出现错误时,执行实际上不会停止。例如,如果我在open editor中有以下代码:

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)
    }
  }
}