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