什么是定义通用功能的好方法,它应该具有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方法本身.
原文链接:https://www.f2er.com/javaschema/281345.htmlsetClass("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的方法.我只是信使.