Gestion des erreurs avec les classes S4
Question
Je suis un débutant ici. J'essaie d'utiliser des classes S4. Dans certaines de mes méthodes de réglage, je voudrais prendre une valeur d'entrée et tester si elle est valide. S'il est valide, je voudrais l'affecter. S'il n'est pas valide, je voudrais générer un avertissement qui peut être testé. Voici un exemple simple:
setClass("foo", representation(ind = "numeric"))
setGeneric(name="setInd<-",def=function(object,value){standardGeneric("setInd<-")})
setReplaceMethod(f="setInd",signature="foo",
def=function(object,value){
if(is.numeric(value)){
object@ind<-value;}
else{
warning("Foobar")
}
return(object)}
)
Cela génère un message d'avertissement lorsque j'essaie d'attribuer un personnage:
> thisFoo<-new("foo", ind = 2)
> thisFoo
An object of class "foo"
Slot "ind":
[1] 2
> setInd(thisFoo)<-"A"
Warning message:
In `setInd<-`(`*tmp*`, value = "A") : Foobar
> thisFoo
An object of class "foo"
Slot "ind":
[1] 2
Mais je voudrais être en mesure de tester que l'affectation a échoué. Quelle est une bonne façon de faire cela? Merci.
La solution
Si l'affectation échoue, je renvoie une erreur au lieu d'un avertissement. Un avertissement vous indique que le processus est passé, mais pourrait donner un résultat inattendu. Dans votre cas, le processus est interdit:
setReplaceMethod(f="setInd",signature="foo",
def=function(object,value){
if(!is.numeric(value))
stop("Foobar")
object@ind <- value
return(object)}
)
utilisant stop
vous permet d'utiliser tryCatch()
ou try()
Constructions. Voir les pages d'aide pertinentes pour plus d'informations. Par exemple :
tryCatch(setInd(thisFoo)<-"A",error=function(e){print("Hello")})
> X <- try(setInd(thisFoo) <- "A")
Error in `setInd<-`(`*tmp*`, value = "A") : Foobar
> if(is(X,"try-error")) setInd(thisFoo) <- 5
> thisFoo
An object of class "foo"
Slot "ind":
[1] 5
Si vous avez vraiment besoin de travailler avec des avertissements, regardez withCallingHandlers
. Utilisation de votre code d'origine:
> withCallingHandlers({setInd(thisFoo)<-"A"},
+ warning = function(w) {print("Hello")})
[1] "Hello"
Warning message:
In `setInd<-`(`*tmp*`, value = "A") : Foobar
Attention, c'est moins simple à utiliser que les options susmentionnées à l'aide d'erreurs.