2013-05-07 37 views
3

我想創建一個S4方法'myMethod',它不僅調用該函數的第一個參數的類,還調用其中一個時隙的值這類的。在S4類的插槽上調度S4方法

例如

myObject的:
@ SLOT1 = 「A」
@ ...

我想myMethod的(myObject的),以回報東西SLOT1 = 「A」 不同,插槽2 = 「B」。

我可以避免硬編碼'myObject'代碼中的'if'嗎?

回答

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, [email protected], ...)) 

然後方法來處理重新調度

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" 
+0

這似乎是按照OP中所述的方式,按照槽位的類別而不是價值進行分派? – kevinykuo 2017-03-23 14:29:25

+0

我想我的假設是,槽值來自一組有限的可能值,可以很容易地表示爲一個類層次結構。我想這也意味着人們想要列舉可能的行爲。但是你是對的,它不是根據價值本身進行調度。 – 2017-03-24 00:51:42

+0

謝謝。有沒有比在方法中編寫'if ... else ...'代碼更優雅的模式來分配插槽的值?我得到一個包與另一個包一起工作,所以我想避免在上游提出改變。 – kevinykuo 2017-03-24 13:35:58