Credo che il modo adeguato è quello di utilizzare "ANY" nella 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"
Assicurarsi di specificare ogni altra possibilità che si desidera curato, come "qualsiasi" prende anche tutto il resto che non si adatta alla firma di un altro metodo.
Se si dispone di argomenti che possono essere mancanti, non è possibile specificarli nella firma di setMethods e impostare un valore predefinito nel generico. Questo è, a mio modesto avviso, una scelta di design migliore.
Ora è possibile gestire i codici NULL in-code come si farebbe con gli argomenti mancanti.
Su un sidenote: ora ho aggiunto NULL come valore predefinito, ma in molti casi ci sono scelte molto più sensate per i valori predefiniti. Ricorda solo che setMethod prende la firma iniziale e che quando y è impostato come NULL, questo non viene sostituito dal valore predefinito.
esempio:
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 DIRTY:
Trovo l'approccio un po 'imbarazzante, ma qui è un hack sporco che imposta tutti i parametri mancanti per 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")
}
Provando questo, si ottiene:
> foo(1)
[1] "numeric"
> foo(NULL)
[1] "NULL"
> foo()
[1] "NULL"
Quindi non si spedisce mai più al mancante. Puoi semplicemente dimenticartene. Ma questo non è il modo appropriato di fare le cose ...
Grande, grazie per la risposta. Questo è quello che voglio. –