R предотвращение предупреждения "перезапуск прерванной оценки обещаний"
кажется, что внутри функции, когда вы оцениваете выражение, которое дает ошибку более одного раза, вы получаете предупреждение restarting interrupted promise evaluation
. Например:
foo <- function() stop("Foo error")
bar <- function(x) {
try(x)
x
}
bar(foo())
доходность
Error in foo() : Foo error
Error in foo() : Foo error
In addition: Warning message:
In bar(foo()) : restarting interrupted promise evaluation
Как избежать этого предупреждения и справиться с ней должным образом?
фон
особенно с такими операциями, как запись в базу данных, вы можете столкнуться с ошибками блокировки, которые требуют повторной попытки операции несколько раз. Поэтому я создаю обертку вокруг tryCatch
это повторно оценивает выражение до n
раз, пока не увенчались успехом:
tryAgain <- function(expr, n = 3) {
success <- T
for (i in 1:n) {
res <- tryCatch(expr,
error = function(e) {
print(sprintf("Log error to file: %s", conditionMessage(e)))
success <<- F
e
}
)
if (success) break
}
res
}
, Я получаю нагрузок restarting interrupted promise evaluation
сообщения:
> tryAgain(foo())
[1] "Log error to file: Foo error"
[1] "Log error to file: Foo error"
[1] "Log error to file: Foo error"
<simpleError in foo(): Foo error>
Warning messages:
1: In doTryCatch(return(expr), name, parentenv, handler) :
restarting interrupted promise evaluation
2: In doTryCatch(return(expr), name, parentenv, handler) :
restarting interrupted promise evaluation
в идеале я хочу избежать этих сообщений вообще, а не просто приглушить их, так как я также могу захотеть обрабатывать подлинные предупреждения, поступающие от expr
.
1 ответов
вы также можете попробовать это без silent=TRUE
Если вы хотите, чтобы каждое сообщение об ошибке, чтобы показать. Ни в том, ни в другом случае вы не получите сообщение об обещаниях:
foo <- function() stop("Foo error")
bar <- function(x) {
try(eval.parent(substitute(x)), silent = TRUE)
x
}
bar(foo())