2013-08-27 44 views
1

我有一個對象C它繼承類B其具有每個等級的方法,例如,沿着繼承類A, ,對所有類的對象執行s4方法?

setClass("A", representation(a = 'numeric')) 
setClass("B", representation(b = 'numeric'), contains="A") 
setClass("C", representation(c = 'numeric'), contains="B") 

和方法

setGeneric("toXML", function(obj, node) standardGeneric("toXML")) 
setMethod("toXML", 
      signature("A", "XMLInternalElementNode"), 
      function(obj, node) addAttributes(node, a = [email protected])) 
setMethod("toXML", 
      signature("B", "XMLInternalElementNode"), 
      function(obj, node) addAttributes(node, b = [email protected])) 
setMethod("toXML", 
      signature("C", "XMLInternalElementNode"), 
      function(obj, node) addAttributes(node, c = [email protected])) 

也就是說,每個類表示一XML節點可能具有的屬性。
我想寫一個方法(或強制),將執行這些功能 所有匹配的類。

當然我寫的方式,做

library(XML) 
obj <- new("C", a = 1, b = 2, c = 3) 
toXML(obj, newXMLNode("node")) 

只是返回:

<node c="3"/> 

而不是

<node a="1" b="2" c="3"/> 

什麼會去了解的好方法這個?

回答

2

也許使用callNextMethod()

setGeneric("toXML", function(obj, node) standardGeneric("toXML")) 
setMethod("toXML", 
      signature("A", "XMLInternalElementNode"), 
      function(obj, node) addAttributes(node, a = [email protected])) 
setMethod("toXML", 
      signature("B", "XMLInternalElementNode"), 
      function(obj, node) { 
       node <- callNextMethod()   ## <- Line I added 
       addAttributes(node, b = [email protected]) 
       }) 
setMethod("toXML", 
      signature("C", "XMLInternalElementNode"), 
      function(obj, node) { 
       node <- callNextMethod()   ## <- Line I added 
       addAttributes(node, c = [email protected]) 
      }) 

## Trying it out 
obj <- new("C", a = 1, b = 2, c = 3) 
toXML(obj, newXMLNode("node")) 
# <node a="1" b="2" c="3"/> 
+0

太棒了。閱讀完文檔後,我仍然不清楚爲什麼將'callNextMethod'分配給'node'。對我來說似乎很奇怪;看起來這只是覆蓋其中一個參數,即使它不是? – cboettig

+0

@cboettig謝謝。你需要用'callNextMethod()'返回的結果(本地)覆蓋'node',否則這些結果將會'消失到以太'中。這裏沒有奇特的原則,只是R的標準哲學不執行任務,除非有明確的指示(即不作爲副作用)。這與你做這件事的原因是一樣的:'f < - function(x){x <-x^2; x + 3}'而不是這個:'f < - function(x){x^2; x + 3}「,如果你希望這個'x^2'對調用'f'的返回值有任何影響。 –

+0

沒錯,但是這種情況比x的情況下我更加微妙,在這種情況下用數字替換數字。 addAttributes'期望'node'參數是一個「XMLInternalElementNode」類。如何調用callNextMethod而不使用參數知道返回此類的對象? – cboettig

相關問題