使用delayedAssign()
创建promise,很容易构建一个可能导致restarting interrupted promise evaluation
警告发出的场景。为什么在这种情况下会抛出警告?此警告是否表示“不安全”的做法,或者这更多的是“供参考”,可以安全地忽略(即消声)?考虑以下示例:
counter <- 0L
make_val <- function() {
if (counter < 1L) {
counter <<- counter + 1L
stop("insufficient count")
}
"yay!"
}
delayedAssign("foo", make_val())
foo
#> Error in make_val() : insufficient count
foo
#> [1] "yay!"
#> Warning message:
#> restarting interrupted promise evaluation
foo
#> [1] "yay!"
将此警告静默是否安全?或者重新启动中断的承诺评估是应该避免的事情?
get_foo <- function() {
mute_ripe <- function(warn) {
if (identical(conditionMessage(warn),
"restarting interrupted promise evaluation")) {
invokeRestart("muffleWarning")
}
}
tryCatch(
withCallingHandlers(get("foo", envir = .GlobalEnv), warning = mute_ripe),
error = function(err) NULL
)
}
counter <- 1L
delayedAssign("foo", make_val())
get_foo()
#> NULL
get_foo()
#> [1] "yay!"
get_foo()
#> [1] "yay!"
发布于 2020-10-01 17:52:47
我会保留这条警告信息。考虑下面的例子
counter <- 0L
make_val <- function() {
counter <<- counter + 1L
if (counter == 4L) {
stop("somehow triggered an error halfway through")
}
counter
}
for (letter in letters[1:10]) {
delayedAssign(letter, make_val())
}
a; b; c; d; e; f; g; h; i; j
在这里,我将在将来将1:10
赋值给变量a-j
。每个变量都是状态相关的,因为当且仅当前一个赋值成功时,才会为变量赋值(但不是推荐的做法)。如果以某种方式在求值链中途发生错误,那么您可以看到求值正好在发生错误的地方停止。
> a; b; c; d; e; f; g; h; i; j
[1] 1
[1] 2
[1] 3
Error in make_val() : somehow triggered an error halfway through
然而,如果您重新运行代码,那么您可以成功地完成每个任务,但您只是得到了一组错误的结果。
> a; b; c; d; e; f; g; h; i; j
[1] 1
[1] 2
[1] 3
[1] 5
Warning message:
restarting interrupted promise evaluation
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
如果没有这样的警告消息,那么我认为用户可能无法识别这组错误结果的可能性不为零,因为当用户尝试重新运行代码进行调试时,赋值是没有错误的。
https://stackoverflow.com/questions/64151612
复制相似问题