3

関数の最初の引数のクラスだけでなく、このクラスのスロットの 1 つの値にもディスパッチする S4 メソッド 'myMethod' を作成したいと思います。

例えば

myObject:
@slot1="A"
@...

myMethod(myObject) が slot1="A" と slot2="B" に対して異なるものを返すようにしたいと思います。

「myObject」のコードで「if」をハードコーディングするのを避けることはできますか?

4

1 に答える 1

4

完全に珍しいわけではないパターンは、小さなクラスを使用して複数のディスパッチを提供することです

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"
于 2013-05-07T12:23:22.307 に答える