web-dev-qa-db-ja.com

「中断されたプロミス評価の再開」警告を回避

問題

関数内で、エラーが2回以上発生する式を評価すると、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からの真の警告も処理したいので、理想的には、これらのメッセージを単に消音するのではなく、完全に回避したいです。

29
mchen

各エラーメッセージを表示する場合は、silent=TRUEなしでこれを試すこともできます。どちらの場合も、約束に関するメッセージは表示されません。

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