成语默认的S4方法?

时间:2019-07-12 09:35:34

标签: r methods s4

是否有任何针对S4泛型编写后备方法的方法?我的意思是,如果没有匹配的签名,您是否编写了一个用作默认方法的函数,该函数可能抛出message()来解释有效签名?您使用什么回报值?还是抛出错误?或者您什么都不做,让R抛出常见错误"unable to find an inherited method for function (...)"

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如果您可以编写一个可能适用于各种可能的类的泛型,那么这样做是很常见的。例如,terms的(S3)默认方法尝试查找$terms组件(或属性)-请注意,这包括当参数是带有@terms槽的S4对象时的情况。 )的第一个参数:

function (x, ...) 
{
    v <- x$terms
    if (is.null(v)) {
        v <- attr(x, "terms")
        if (is.null(v)) 
            stop("no terms component nor attribute")
    }
    v
}

({terms恰好是S3泛型,但是没有理由为什么如果是S4,它仍然不会如此表现。)

如果没有明智的事情,您可以做的就是为默认方法编写的代码就是一个函数,该函数接受泛型签名中的所有参数(如果有某些方法可以加上...有额外的参数),只需按照您的建议调用stop并显示一条错误消息即可。

在S3中,您不需要执行此操作—您无法定义默认方法。 predict就是这种情况-如果您致电predict(2,3)说,那么您将得到一个错误no applicable method for 'predict' applied to an object of class "c('double', 'numeric')"。在S4中,您将需要在对setGeneric的调用中自己定义这样的默认方法。

答案 1 :(得分:1)

是的,有一种商定的方法,具体取决于一个好的默认函数是否已经作为非泛型存在。

1。如果已经有可以用作默认值的非泛型函数

只需使其通用:

setGeneric('function_name')

2。如果还没有非通用默认功能

  1. 定义新的泛型

    setGeneric(
        'function_name',
        function (object) {
            standardGeneric('function_name')
        }
    )
    
  2. 添加具有全部参数的默认实现

    setMethod(
        'function_name',
        signature(object = 'ANY'),
        function (object) {
            …
        }
    )