2017-02-15 173 views
7

在RStudio中执行代码块时,发生错误时执行实际上不会停止。例如,如果我在打开的编辑器下面的代码:在RStudio/Interactive R会话中发生错误时执行停止

x <- 'test' 
stopifnot(is.numeric(x)) 
print('hello world') 

并运行(或者使用命令返回或通过单击“运行”按钮),它打印错误,但随后游行上并执行打印声明。

有没有一种方法可以配置RStudio不会超过错误?即在上面的第2行停下来,而不是继续打印声明?

编辑:刚才意识到这也发生,如果我使用命令-R在标准R GUI中发送代码块。

+0

如果您将其作为源文件执行,那么它将按照您的要求工作。例如,如果您将3行代码复制并粘贴到控制台并按Enter,则它将分别运行每行代码。第二种模式可能是运行按钮的操作。 – lmo

+1

@lmo谢谢 - 问题是我认识的大多数人都是交互式的程序。我正在为社会科学家编写一个教程,将测试放在他们的代码中,并且需要在他们所在的位置见到他们。 –

+0

总是有'tryCatch'和'try'。 – lmo

回答

0

我不认为有一种方法可以防止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()来简单地中止执行。我已经检查过,按Ctrl + Enter或RStudio中的Source按钮(无限循环)以及Bash命令行上的Rscript(程序中止),可以按预期工作。

相关问题