Создание метода S4 с именем «медиана»

Здесь лучшие ответы описывают хороший способ сделать отправку метода для объектов S3 и S4. Однако этот способ работает только тогда, когда оба метода имеют одинаковую сигнатуру.

Есть ли способ создать метод S4 для median с другой подписью?

Например, следующее не работает:

setGeneric("median")
median.Foo <- function(arg1, arg2, ...){}
setMethod("median", "Foo", median.Foo)

При установке библиотеки возникает ошибка, говорящая о том, что отсутствуют формальные аргументы, x и na.rm, которые являются аргументами исходной функции медианы.

Я хотел бы избежать решения в верхней части поста автора.


person Jon Claus    schedule 26.09.2013    source источник
comment
Это не похоже на правильный метод создания функции S4. Формализм fn_name.class_name <- function(...) {body} предназначен для определения функций S3. Прочтите ?setMethod и посмотрите примеры там.   -  person IRTFM    schedule 26.09.2013
comment
Я просто копировал часть кода в ссылке. Обычно я не структурирую имена своих функций таким образом.   -  person Jon Claus    schedule 26.09.2013
comment
Вам нужно посмотреть ответ Марин Морган (и на странице справки). Он знает больше, чем спрашивающий.   -  person IRTFM    schedule 26.09.2013
comment
В коде Марина он вызывает setMethod с третьим аргументом в форме function.class". In this case I want a S4 method for медиана` для класса Foo и median.default (встроенный метод S3), вызываемый иначе.   -  person Jon Claus    schedule 26.09.2013
comment
Вы решили проблему?   -  person rankthefirst    schedule 31.10.2015


Ответы (1)


setGeneric("median") создает универсальный S4 с той же сигнатурой, что и stats::median

> stats::median
function (x, na.rm = FALSE) 
UseMethod("median")
<environment: namespace:stats>

чтобы вы могли написать методы

median.Foo <- function(x, na.rm=FALSE) {}
setMethod(median, "Foo", median.Foo)

Я думаю, что сообщение о проверке пакета будет адресовано

setGeneric("median", function(arg1, arg2, ...) standardGeneric("median"))

а дальше как вы пишете. Но, вероятно, это плохая идея, потому что теперь методы S3 маскируются вашей функцией

> median(1:5)
Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function 'median' for signature '"integer"'

Я думаю, вы застряли с аргументами по умолчанию или измененным именем функции. В заголовке вашего поста написано Median, а R чувствителен к регистру... но это тоже плохая идея.

person Martin Morgan    schedule 26.09.2013
comment
Хорошо, немного облом, чем я застрял с аргументами по умолчанию. Что я сделал, так это замаскировал функцию median по умолчанию (в пакете stats), используя метод S4 с конструкцией ... в списке аргументов, а затем просто отправил встроенную функцию median, как это сделал OP в ссылке. Когда я ввожу библиотеку в R, мне выдается предупреждение о том, что The following object is masked from ‘package:stats’: median. Есть ли способ сделать так, чтобы такое сообщение не появлялось? suppressWarnings не работает с функцией library. - person Jon Claus; 27.09.2013
comment
suppressPackageStartupMessages() заглушает сообщение (технически не предупреждение), но сообщение не является неверным, поэтому... - person Martin Morgan; 27.09.2013