Объединение методов 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
.
В любом случае, все становится грязно, и я думаю, что это общая проблема, так что, возможно, есть лучшие способы сделать это?