Объединение методов S4 и S3 в одну функцию

Каков хороший способ определения функции общего назначения, которая должна иметь реализации для классов S3 и S4? Я использовал что-то вроде этого:

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));
});

Это успешно:

myfun.bar <- function(x, ...){
    return("Object of class bar successfully dispatched.");
}
object <- structure(123, class=c("foo", "bar"));
myfun(object)

Есть ли ход "родной"? способ сделать это? Я знаю, что мы можем определить методы S4 для классов S3, используяsetOldClassоднако таким образом мы теряем диспетчеризацию метода S3 в случае, если у объекта есть несколько классов. Например. (в чистом сеансе):

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)

Это не удается, потому что второй классobject, в этом случаеbar, игнорируется. Возможно, мы могли бы это исправить, определив формальное наследование S4 междуfoo а такжеbar, но для моего приложения я бы предпочелmyfun.bar работать из коробки на объектах S3 с классомbar.

В любом случае, все становится грязно, и я думаю, что это общая проблема, так что, возможно, есть лучшие способы сделать это?

Ответы на вопрос(1)

Ваш ответ на вопрос