我有兴趣为通用函数设置新方法。例如,假设我有一个新班级(例如coolClass
)。我可以写一个包装来计算类的log10
和方便的设置方法与下面的代码:用于S4的R可选参数setMethod
setMethod("Math", c(x="coolClass"),
function(x)
{
op = .Generic[[1]]
switch(op,
`log10` = log10_for_coolClass(x),
stop("Undefined operation")
)
}
)
但是,我无法弄清楚如何设置的方法来传递多个参数。例如,通用的log
方法。运行getGeneric("log")
显示以下内容:
> getGeneric("log")
standardGeneric for "log" defined from package "base"
belonging to group(s): Math
function (x, ...)
standardGeneric("log", .Primitive("log"))
<bytecode: 0x2f9a958>
<environment: 0x2f937f0>
Methods may be defined for arguments: x
Use showMethods("log") for currently available ones.
看到这一幕,我希望我可以写下面,以便能够通过可选的base
说法。
setMethod("Math", signature(x="coolClass",...),
function(x, ...)
{
op = .Generic[[1]]
switch(op,
`log` = log_for_coolClass(x, ...),
stop("Undefined operation")
)
}
)
,但我得到了以下错误:
Error in matchSignature(signature, fdef, where) :
'...' used in an incorrect context
没有...
试图在signature
我得到一个不同的错误:
Error in rematchDefinition(definition, fdef, mnames, fnames, signature) :
methods can add arguments to the generic ‘Math’ only if '...' is an argument to the generic
给这似乎很奇怪,我说getGeneric
日志显示该方法中的...
。
任何想法?有没有办法捕捉更多的参数?我试图让S4方法变得更加舒适,但我对如何传递可选参数感到困惑。如果这是不可能的,如果有人可以解释log
函数如何工作,例如,假设函数是Math
组的一部分,但接受多个参数,我将不胜感激。
更新
奇怪的是,如下所述,我可以直接在log
使用setMethod
有以下几点:
setMethod("log", signature(x="big.matrix"),
function(x, base=exp(1))
{
log_for_coolClass(x, base=base)
}
)
然而,这并不完全平息我的好奇心。例如,如果我在Math
组内创建了许多新方法,那么在代码中如此重复似乎很奇怪。理想情况下它会是这个样子:
setMethod("Math", c(x="coolClass"),
function(x, base=exp(1))
{
op = .Generic[[1]]
switch(op,
`log10` = log10_for_coolClass(x),
`log` = log_for_coolClass(x, base=base),
stop("Undefined operation")
)
}
)
你的答案就像我直接在'log'上发现'setMethod'一样。使用'callGeneric'访问所有数学运算是很有趣的,但是我的类需要更复杂的函数,我需要单独编写并且必须调用。因此,看起来我必须分开设置某些方法。我希望能够更简洁(见更新的问题),但如果这是唯一的方法。 – cdeterman 2014-11-21 20:22:39