R éviter de" recommencer l'évaluation de la promesse interrompue " avertissement

Problème

Il semble que dans une fonction, lorsque vous évaluez une expression qui donne une erreur plus d'une fois, 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?

Background

surtout avec des opérations comme l'écriture dans une base de données, vous pourriez rencontrer des erreurs de verrouillage qui vous obligeront à réessayer votre opération à plusieurs reprises. Conséquent Je suis de la création d'un wrapper autour de tryCatch qui réévaluent une expression jusqu'à n fois jusqu'à ce que réussi:

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 suis prise en charge 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 ces messages tout à fait plutôt que de simplement les étouffer, puisque je pourrais aussi vouloir gérer de véritables Avertissements venant de expr.

26
demandé sur mchen 2013-12-15 20:36:02

1 réponses

Vous pouvez aussi essayer ceci sans silent=TRUE si vous voulez que chaque message d'erreur s'affiche. Dans aucun des deux cas, vous ne recevrez le message concernant les promesses:

foo <- function() stop("Foo error")
bar <- function(x) {
    try(eval.parent(substitute(x)), silent = TRUE)
    x
}
bar(foo())
10
répondu G. Grothendieck 2013-12-15 20:27:13