Quale è un buon modo per definire una funzione generica che dovrebbe avere implementazioni per entrambe le classi S3 e S4? Sono stato con qualcosa di simile:Combinazione dei metodi S4 e S3 in una singola funzione
setGeneric("myfun", function(x, ...){
standardGeneric("myfun");
});
setMethod("myfun", "ANY", function(x, ...) {
if(!isS4(x)) {
return(UseMethod("myfun"));
}
stop("No implementation found for class: ", class(x));
});
Questo succede:
myfun.bar <- function(x, ...){
return("Object of class bar successfully dispatched.");
}
object <- structure(123, class=c("foo", "bar"));
myfun(object)
C'è una mossa modo "nativo" per raggiungere questo obiettivo? So che possiamo definire i metodi S4 per le classi S3 usando setOldClass
, tuttavia in questo modo perdiamo il dispacciamento del metodo S3 nel caso in cui un oggetto abbia più classi. Per esempio. (In una sessione pulita):
setGeneric("myfun", function(x, ...){
standardGeneric("myfun");
});
setOldClass("bar")
setMethod("myfun", "bar", function(x, ...){
return("Object of class bar successfully dispatched.");
});
object <- structure(123, class=c("foo", "bar"));
myfun(object)
Ciò non riesce perché la seconda classe di object
, in questo caso bar
, viene ignorato. Probabilmente potremmo risolvere questo problema definendo l'ereditarietà S4 formale tra foo
e bar
, ma per la mia applicazione preferirei che lo myfun.bar
funzioni fuori dagli schemi sugli oggetti S3 con una classe bar
.
In entrambi i casi, le cose stanno diventando disordinate, e immagino che questo sia un problema comune, quindi ci sono probabilmente modi migliori per farlo?
Vedere anche http://stackoverflow.com/questions/12709933/adding-s4-dispatch-to-base-r-s3-generic per il caso speciale di aggiunta di S4 a un S3 generico nella base R. –