web-dev-qa-db-fra.com

attraper une erreur, puis la logique de branchement

Comment écrire du code R qui me permet d'exécuter un chemin différent dans mon code si une condition d'erreur se produit? J'utilise une fonction qui a tendance à générer une erreur. Quand il remplit une condition d'erreur, je voudrais exécuter une fonction différente. Voici un exemple spécifique:

require(SuppDists)
parms <- structure(list(gamma = -0.841109044800762, delta = 0.768672140584442, 
    xi = -0.359199299528801, lambda = 0.522761187947026, type = "SB"), .Names = c("gamma", 
"delta", "xi", "lambda", "type"))
pJohnson(.18, parms)

la fonction pJohnson devrait échouer avec l'erreur suivante:

 Error in pJohnson(0.18, parms) :
 Sb values out of range.

Je peux rendre l'erreur silencieuse en utilisant:

try( pJohnson(.18, parms), silent=T)

mais ce que je veux vraiment faire, c'est exécuter la fonction alternativeFunction() si pJohnson(.18, parms) renvoie une erreur.

Il semble que la fonction withCallingHandlers() devrait m'aider, mais je ne peux pas comprendre comment capturer l'erreur et la faire exécuter la alternativeFunction() uniquement en cas d'erreur.

41
JD Long
t <- try(pJohnson(.18, parms))
if("try-error" %in% class(t)) alternativeFunction()
48
Ian Fellows

Une autre option pourrait consister à utiliser une expression tryCatch. Voici un exemple:

 vari <- 1
 tryCatch(print("passes"),  error = function(e) print(vari)) # => passes
 tryCatch(stop("fails"),  error = function(e) print(vari)) # => 1

Vous pouvez faire ce que vous voulez dans le bloc d'erreur, donc dans votre cas, quelque chose comme ça devrait fonctionner:

tryCatch(pJohnson(.18, parms), error=function(e) alternativeFunction())

Ce n'est pas vraiment l'usage prévu de l'erreur, mais c'est un peu plus concis.

15
Shane