Мне интересно установить новые методы для общих функций. Например, допустим, у меня есть новый класс (например, coolClass
). Я мог бы написать обертку, чтобы вычислить log10
этого класса и легко установить метод со следующим кодом:R дополнительных аргументов для S4 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
, но принимает несколько аргументов.
Update
Любопытно, что, как указано ниже, можно использовать setMethod
непосредственно на log
со следующим:
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")
)
}
)
Ваш ответ пришел так же, как я обнаружил 'setMethod' непосредственно на' log'. Интересно получить доступ ко всем операциям Math с помощью 'callGeneric', но мой класс требует более сложных функций, которые я пишу отдельно и должен вызывать. Таким образом, кажется, что я должен установить определенные методы отдельно. Я надеялся быть более кратким (см. Обновленный вопрос), но если это единственный способ. – cdeterman