我使用RStudio在R中编写代码。通常我通过选择并按Ctrl + Enter
来提交更大的代码块。现在,当发生错误时(例如,无法建立与数据库的连接),我想中止后续代码的执行。
我尝试了stop()
,当所有代码都在一行中时,它会起作用:
# 21 is not shown
42; stop("error"); 21;
但是当代码跨越多行时,代码仍然会被评估:
# Here 21 is shown
42
stop("error")
21
提交更大的代码块是否可以中止代码的执行?
答案 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)
print
e.g。
{
print(42)
stop("error")
print(21)
}
#[1] 42
# Error: error
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