отправить метод S4 через слот класса S4

Я хотел бы создать метод S4 myMethod, который отправляет не только класс первого аргумента функции, но и значение одного из слотов этого класса.

например

мойОбъект:
@slot1="A"
@...

Я хотел бы, чтобы myMethod(myObject) возвращал что-то другое для slot1="A" и slot2="B".

Могу ли я избежать жесткого кода «если» в коде «myObject»?


person RockScience    schedule 07.05.2013    source источник


Ответы (1)


Не совсем редким шаблоном является использование небольших классов для обеспечения множественной диспетчеризации.

setClass("Base")
A = setClass("A", contains="Base")
B = setClass("B", contains="Base")
My = setClass("My", representation(slot1="Base"))

setGeneric("do", function(x, y, ...) standardGeneric("do"))
setMethod("do", "My", function(x, y, ...) do(x, x@slot1, ...))

а затем методы обработки повторной отправки

setMethod("do", c("My", "A"), function(x, y, ...) "My-A")
setMethod("do", c("My", "B"), function(x, y, ...) "My-B")

В действии:

>     My = setClass("My", representation(slot1="Base"))
>     a = My(slot1=A())
>     b = My(slot1=B())
>     do(a)
[1] "My-A"
>     do(b)
[1] "My-B"
person Martin Morgan    schedule 07.05.2013
comment
Кажется, это относится к классу слота, а не к значению, как указано в OP? - person kevinykuo; 23.03.2017
comment
Я предполагаю, что мое предположение заключалось в том, что значения слотов исходили из ограниченного набора возможных значений, которые можно было бы легко представить в виде иерархии классов. Я предполагаю, что это также подразумевается тем фактом, что кто-то хотел перечислить возможные варианты поведения. Но вы правы, это не отправка значений как таковых. - person Martin Morgan; 24.03.2017
comment
Спасибо. Есть ли более элегантный шаблон для отправки значений слотов, чем запись кода if...else... в методе? Я получаю пакет для работы с другим пакетом, поэтому я не хочу предлагать изменения вверх по течению. - person kevinykuo; 24.03.2017