Pregunta

Soy un novato aquí.Estoy intentando usar las clases S4.En algunos de mis métodos de configuración, me gustaría tomar un valor de entrada y probar si es válido.Si es válido, me gustaría asignarlo.Si no es válido, me gustaría generar una advertencia que se pueda probar.Aquí hay un ejemplo 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)}
 )

Esto genera un mensaje de advertencia cuando intento asignar un carácter:

> 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

Pero me gustaría poder probar que la tarea falló.¿Cuál es una buena forma de hacer esto?Gracias.

¿Fue útil?

Solución

Si la tarea falla, devolvería un error en lugar de una advertencia.Una advertencia le indica que el proceso se realizó, pero que podría dar un resultado inesperado.En su caso, el proceso se cancela:

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

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

El uso de stop le permite utilizar las construcciones tryCatch() o try().Consulte las páginas de ayuda correspondientes para obtener más información.Por ejemplo:

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 realmente necesita trabajar con advertencias, mire withCallingHandlers.Usando su código original:

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

Eso sí, esto es menos sencillo de usar que las opciones mencionadas anteriormente que usan errores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top