中止R中代码的执行(-Studio)

时间:2015-07-27 10:17:43

标签: r rstudio abort

我使用RStudio在R中编写代码。通常我通过选择并按Ctrl + Enter来提交更大的代码块。现在,当发生错误时(例如,无法建立与数据库的连接),我想中止后续代码的执行。

我尝试了stop(),当所有代码都在一行中时,它会起作用:

# 21 is not shown
42; stop("error"); 21;

但是当代码跨越多行时,代码仍然会被评估:

# Here 21 is shown
42
stop("error")
21

提交更大的代码块是否可以中止代码的执行?

2 个答案:

答案 0 :(得分:4)

您可以将代码包装在{}(大括号)之间,因为它们与您的;链几乎相同。

{
  42
  stop("error")
  21
}
## Error: error

这里有一个很好的例子,来自带有界面功能的文档。

do <- get("{")
do(x <- 3, y <- 2*x-3, 6-x-y)
## [1] 0
x <- 3; y <- 2*x-3; 6-x-y
## [1] 0

答案 1 :(得分:2)

@ DavidArenburg的回答肯定是最简单的方法。但是,从您的问题中不清楚是否要保留在运行时打印每个语句的值的行为,这是在RStudio中使用Ctrl-Enter时通常会发生的情况。如果您确实想这样做,那么您的选择将是:

  1. print
  2. 中包装要输出的每个语句

    e.g。

    {
      print(42)
      stop("error")
      print(21)
    }
    
    #[1] 42
    # Error: error
    
    1. 使用自定义功能实现此目的:
    2. e.g。

      block <- function(expr) {
        expr <- substitute(expr)
        for (i in seq(expr)[-1]) {
          y <- withVisible(eval(expr[[i]], parent.frame()))
          if (y$visible && i != length(expr)) print(y$value)
        }
        y$value
      }
      
      block({
        42
        stop("error")
        21
      })
      
      #[1] 42
      # Error in eval(expr, envir, enclos) : error
      

      请注意,在所有情况下,在完成阻止之前,实际上不会执行任何语句。

      对于非平凡的代码块,与标准执行相比,执行速度的差异可以忽略不计。

      e.g。

      microbenchmark::microbenchmark(block = block({
        a <- 1:1e6
        b <- rnorm(1e6)
        sum(a + b)
      }), curly = {
        a <- 1:1e6
        b <- rnorm(1e6)
        sum(a + b)
      })
      
      #Unit: milliseconds
      #  expr      min       lq     mean   median       uq      max neval
      # block 108.7961 130.2517 169.4891 176.8425 197.4749 299.4014   100
      # curly 109.9183 134.3076 171.9430 174.7121 194.5748 292.5958   100