Ich denke, der richtige Weg „ANY“ in der Signatur zu verwenden ist:
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"
Stellen Sie sicher, Sie geben alle anderen Möglichkeiten, die Sie getroffen wollen kümmern, als „ANY“ den ganzen Rest nimmt auch, dass passt nicht zur Signatur einer anderen Methode.
Wenn Sie Argumente haben, die fehlen können, können Sie sie einfach nicht in der Signatur von setMethods angeben und einen Standardwert im generischen festlegen. Dies ist - meiner bescheidenen Ansicht nach - eine bessere Design-Wahl.
Jetzt können Sie mit den NULL-Fällen in Code umgehen, als würden Sie mit den fehlenden Argumenten tun.
Auf einer Nebenbemerkung: Jetzt habe ich NULL als Standardwert hinzugefügt, aber in vielen Fällen gibt es viel sinnvollere Auswahlmöglichkeiten für Standardwerte. Denken Sie daran, dass setMethod die anfängliche Signatur annimmt und dass, wenn y als NULL festgelegt ist, dies nicht durch den Standardwert ersetzt wird.
zB:
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)
DIRTY HACK:
ich den Ansatz ein wenig umständlich zu finden, aber hier ist ein schmutziger Hack, dass alle fehlenden Parameter auf NULL setzt:
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")
}
Probieren Sie dies, erhalten Sie:
> foo(1)
[1] "numeric"
> foo(NULL)
[1] "NULL"
> foo()
[1] "NULL"
So versenden Sie nie mehr zu den vermissten. Du kannst es einfach vergessen. Aber dies ist nicht der richtige Weg, Dinge zu tun ...
Großartig, danke für die Antwort. Das ist was ich will. –