web-dev-qa-db-fra.com

R éviter l'avertissement "redémarrage de l'évaluation de promesse interrompue"

Problème

Il semble que dans une fonction, lorsque vous évaluez une expression qui génère plusieurs fois une erreur, vous obtenez l'avertissement restarting interrupted promise evaluation. Par exemple:

foo <- function() stop("Foo error")
bar <- function(x) {
    try(x)
    x
}
bar(foo())

les rendements

Error in foo() : Foo error
Error in foo() : Foo error
In addition: Warning message:
In bar(foo()) : restarting interrupted promise evaluation

Comment éviter cet avertissement et le gérer correctement?

Contexte

Surtout avec des opérations telles que l'écriture dans une base de données, vous pouvez rencontrer des erreurs de verrouillage qui vous obligent à réessayer plusieurs fois votre opération. Par conséquent, je crée un wrapper autour de tryCatch qui réévalue une expression jusqu'à n fois jusqu'à ce qu'il réussisse:

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
}

Cependant, je reçois beaucoup de restarting interrupted promise evaluation messages:

>   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

Idéalement, je veux éviter complètement ces messages plutôt que de les étouffer, car je pourrais aussi vouloir gérer les vrais avertissements provenant de expr.

29
mchen

Vous pouvez également essayer ceci sans silent=TRUE si vous souhaitez que chaque message d'erreur s'affiche. Dans aucun des cas, vous ne recevrez le message des promesses:

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