r – 在单一功能中组合S4和S3方法
|
什么是定义通用功能的好方法,它应该具有S3和S4类的实现?我一直在用这样的东西: setGeneric("myfun",function(x,...){
standardGeneric("myfun");
});
setMethod("myfun","ANY",...) {
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)
有没有一个移动“本地”的方式来完成这个?我知道我们可以使用setOldClass定义S3类的S4方法,但是如果一个对象有多个类,我们将失去S3方法调度.例如. (在干净的会议): setGeneric("myfun",...){
standardGeneric("myfun");
});
setOldClass("bar")
setMethod("myfun","bar",...){
return("Object of class bar successfully dispatched.");
});
object <- structure(123,"bar"));
myfun(object)
这样会失败,因为第二类对象(在这种情况下是bar)被忽略.我们可以通过在foo和bar之间定义正式的S4继承来解决这个问题,但是对于我的应用程序,我宁愿希望myfun.bar在S3对象的框上使用类bar. 无论哪种方式,事情都变得凌乱,我猜这是一个常见的问题,所以可能有更好的方法来做到这一点? 方法“S3通用功能的方法”一节提出了S4通用S3通用方法,S4类的S3式方法,以及S4方法本身.setClass("A") # define a class
f3 <- function(x,...) # S3 generic,for S3 dispatch
UseMethod("f3")
setGeneric("f3") # S4 generic,for S4 dispatch,default is S3 generic
f3.A <- function(x,...) {} # S3 method for S4 class
setMethod("f3","A",f3.A) # S4 method for S4 class
需要S3通用来调度S3类. setGeneric()将f3(即S3通用)设置为默认值,f3,ANY方法实际上是S3通用.由于“任何”属于类层次结构的根,所以S4方法不存在的任何对象(例如,S3对象)都在S3通用结束. 帮助页面上描述了S4类的S3通用程序的定义?方法.我认为,大概S3不知道S4方法,所以如果一个调用S3泛型(例如,因为一个是在一个包名称空间,包知道S3 f3而不是S4 f3)f3通用不会找到S4的方法.我只是信使. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
