r – 在单一功能中组合S4和S3方法

前端之家收集整理的这篇文章主要介绍了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的方法.我只是信使.

原文链接:https://www.f2er.com/javaschema/281345.html

猜你在找的设计模式相关文章