supongo que la forma adecuada es utilizar "ANY" en la firma:
setGeneric("foo",function(x) standardGeneric("foo"))
setMethod("foo","numeric",function(x) "numeric")
setMethod("foo","ANY",function(x) "ANY")
> foo(1)
[1] "numeric"
> foo()
[1] "ANY"
> foo(NULL)
[1] "ANY"
Asegúrese de especificar cualquier otra posibilidad que desea cuidado, como "ANY" también lleva todo el resto que no se ajusta a la firma de otro método.
Si tiene argumentos que pueden faltar, simplemente no puede especificarlos en la firma de setMethods y establecer un valor predeterminado en el genérico. Esta es, a mi humilde opinión, una mejor opción de diseño.
setGeneric("foo",function(x,y=NULL,...) {
standardGeneric("foo")
})
setMethod("foo",c("numeric","ANY"),function(x,y,...) {
print(y)
})
setMethod("foo",c("numeric","numeric"),function(x,y,...) {
x + y
})
> foo(1)
NULL
> foo(1,3)
[1] 4
> foo(1,NULL)
NULL
Ahora puede tratar los casos NULL en código como lo haría con los argumentos faltantes.
En una nota al margen: Ahora agregué NULL como valor predeterminado, pero en muchos casos hay opciones mucho más sensatas para los valores predeterminados. Solo recuerde que setMethod toma la firma inicial, y que cuando y se establece como NULL, esto no se reemplaza por el valor predeterminado.
por ejemplo:
setGeneric("bar",function(x,y=2,...) {
standardGeneric("bar")
})
setMethod("bar",c("numeric","ANY"),function(x,y,...) {
x + y
})
setMethod("bar",c("numeric","numeric"),function(x,y,...) {
x - y
})
> bar(1)
[1] 3
> bar(1,2)
[1] -1
> bar(1,NULL) # this y is not replaced with the default!
numeric(0)
HACK sucio:
encuentro el enfoque un poco incómodo, pero aquí es un truco sucio que establece todos los parámetros que faltan a NULL:
setGeneric("foo",function(x,y,z) {
pars <- names(formals(foo))
for(i in pars){
tryerr <- try(get(i),silent=T)
if(is(tryerr,"try-error")){ assign(i,NULL)}
}
standardGeneric("foo")
}
Al intentar esto, obtiene:
> foo(1)
[1] "numeric"
> foo(NULL)
[1] "NULL"
> foo()
[1] "NULL"
Así que nunca más se enviará a la faltante. Puedes olvidarte de eso. Pero esto no es la forma adecuada de hacer las cosas ...
Genial, gracias por la respuesta. Esto es lo que quiero. –