¿Cuál es una buena forma de definir una función de propósito general que debería tener implementaciones para las clases S3 y S4? He estado usando algo como esto:Combinación de métodos S4 y S3 en una sola función
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));
});
Esto tiene éxito:
myfun.bar <- function(x, ...){
return("Object of class bar successfully dispatched.");
}
object <- structure(123, class=c("foo", "bar"));
myfun(object)
¿Hay alguna manera movimiento "nativo" para lograr esto? Sé que podemos definir métodos S4 para clases S3 usando setOldClass
, sin embargo, de esta manera perdemos el envío del método S3 en caso de que un objeto tenga múltiples clases. P.ej. (En una sesión limpia):
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)
Esta falla porque la segunda clase de object
, en este caso bar
, se ignora. Probablemente podríamos solucionar esto definiendo la herencia formal de S4 entre foo
y bar
, pero para mi aplicación preferiría que myfun.bar
fuera de la caja en objetos S3 con una clase bar
.
De cualquier manera, las cosas se están volviendo complicadas, y supongo que este es un problema común, entonces ¿hay probablemente mejores formas de hacerlo?
Vea también http://stackoverflow.com/questions/12709933/adding-s4-dispatch-to-base-r-s3-generic para el caso especial de agregar envío S4 a un genérico S3 en la base R. –