1. ホーム
  2. r

[解決済み】Rで「中断されたプロミスの評価を再開する」という警告を回避する

2022-02-22 04:04:49

質問内容

問題点

関数内で、エラーが発生する式を複数回評価すると、警告が表示されるようです。 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 .

解決方法は?

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

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