什么是定义应该具有 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)
有没有一种“本机”的方式来实现这一点?我知道我们可以使用 为 S3 类定义 S4 方法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
被忽略了。我们可能可以通过在foo
and之间定义正式的 S4 继承来解决这个问题bar
,但是对于我的应用程序,我宁愿myfun.bar
在具有类的 S3 对象上开箱即用bar
。
无论哪种方式,事情都变得一团糟,我想这是一个常见的问题,所以可能有更好的方法来做到这一点?