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
.
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())