什么是定义通用功能的好方法,它应该具有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的方法.我只是信使.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。