是否有任何针对S4泛型编写后备方法的方法?我的意思是,如果没有匹配的签名,您是否编写了一个用作默认方法的函数,该函数可能抛出message()
来解释有效签名?您使用什么回报值?还是抛出错误?或者您什么都不做,让R抛出常见错误"unable to find an inherited method for function (...)"
。
有什么建议吗?
答案 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)
是的,有一种商定的方法,具体取决于一个好的默认函数是否已经作为非泛型存在。
只需使其通用:
setGeneric('function_name')
定义新的泛型
setGeneric(
'function_name',
function (object) {
standardGeneric('function_name')
}
)
添加具有全部参数的默认实现
setMethod(
'function_name',
signature(object = 'ANY'),
function (object) {
…
}
)