Frage

Ich bin ein Neuling hier.Ich versuche S4-Klassen zu verwenden.Bei einigen meiner Einstellungsmethoden möchte ich einen Eingabewert verwenden und testen, ob er gültig ist.Wenn es gültig ist, möchte ich es zuweisen.Wenn es nicht gültig ist, möchte ich eine Warnung generieren, auf die getestet werden kann.Hier ist ein einfaches Beispiel:

 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)}
 )

Dies erzeugt eine Warnmeldung, wenn ich versuche, ein Zeichen zuzuweisen:

> 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

Aber ich möchte testen können, ob die Zuweisung fehlgeschlagen ist.Was ist ein guter Weg, dies zu tun?Danke.

War es hilfreich?

Lösung

Wenn die Zuweisung fehlschlägt, würde ich anstelle einer Warnung einen Fehler zurückgeben.Eine Warnung weist darauf hin, dass der Prozess durchlaufen wurde, jedoch möglicherweise ein unerwartetes Ergebnis liefert.In Ihrem Fall wird der Vorgang abgebrochen:

setReplaceMethod(f="setInd",signature="foo",
 def=function(object,value){
   if(!is.numeric(value))
     stop("Foobar")

   object@ind <- value  
   return(object)}
 )

Mit stop können Sie tryCatch()- oder try()-Konstrukte verwenden.Weitere Informationen finden Sie auf den entsprechenden Hilfeseiten.ZB:

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

Wenn Sie wirklich mit Warnungen arbeiten müssen, schauen Sie sich den withCallingHandlers an.Verwenden Sie Ihren Originalcode:

> withCallingHandlers({setInd(thisFoo)<-"A"},
+     warning = function(w) {print("Hello")})
[1] "Hello"
Warning message:
In `setInd<-`(`*tmp*`, value = "A") : Foobar

Wohlgemerkt, dies ist weniger einfach zu verwenden als die oben genannten Optionen, bei denen Fehler verwendet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top