Combinando los métodos S4 y S3 en una sola función.

¿Cuál es una buena manera 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:

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 un movimiento "nativo" para lograr esto? Sé que podemos definir los métodos S4 para las clases S3 usandosetOldClassSin embargo, de esta manera perdemos el envío del método S3 en caso de que un objeto tenga varias 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)

Esto falla porque la segunda clase deobject, en este casobar, se ignora. Probablemente podríamos arreglar esto definiendo la herencia formal S4 entrefoo ybar, pero para mi aplicación preferiría querermyfun.bar para trabajar fuera de la caja en objetos S3 con una clasebar.

De cualquier manera, las cosas se están complicando, y supongo que este es un problema común, ¿entonces probablemente haya mejores formas de hacerlo?

Respuestas a la pregunta(1)

Su respuesta a la pregunta