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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top