我有興趣爲通用函數設置新方法。例如,假設我有一個新班級(例如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