Подтвердить что ты не робот

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.

4b9b3361

Ответ 1

Вы также можете попробовать это без silent=TRUE, если вы хотите, чтобы каждое сообщение об ошибке отображалось. В любом случае вы не получите сообщение о promises:

foo <- function() stop("Foo error")
bar <- function(x) {
    try(eval.parent(substitute(x)), silent = TRUE)
    x
}
bar(foo())