Я работаю над любимым проектом в R, который создает собственный класс S3 с именем groupr
. Я написал несколько функций с точечной записью (print.groupr
, subset.groupr
), как описано в Учебник Hadley, но я хочу расширить функцию apply
и не могу найти способ сделать это.
Как показано в руководстве, пакет pryr
предоставляет подсказку. Я вижу, что функции subset
и print
представляют собой разные типы функций, например:
> pryr::ftype(subset)
[1] "s3" "generic"
> pryr::ftype(apply)
[1] "function"
Кроме того, функция subset
печатает это в терминале:
function (x, ...)
UseMethod("subset")
<bytecode: 0x115f0ab88>
<environment: namespace:base>
Но функция apply
выводит весь свой исходный код. Я полагаю, что понимаю, почему это происходит — функции print
, subset
, plot
и т. д. — это функции S3, а apply
— скучная старая нормальная функция, но я не вижу никакого способа расширить функцию apply
. без «перезаписи» базовой функции. Например, UseMethod("apply")
указывает вызов функции на мое пространство имен groupr
при загрузке пакета.
Кто-нибудь знает, как решить эту проблему? А именно, семейство функций apply
не является объектами S3 и не может быть расширено с помощью записи через точку. Кто-нибудь знает, как писать функции apply.myclass
, apply.myotherclass
?
apply
не является общим. Я считаю, что в этом и заключается разница, должно быть неудобно писать к нему методы. Как вы сказали, вам придется перезаписать базовую функцию. - person Rui Barradas   schedule 30.03.2018