Xml 是否为对象的所有类执行s4方法?

Xml 是否为对象的所有类执行s4方法?,xml,r,s4,Xml,R,S4,我有一个对象C,它继承了类B,它继承了类A, 以及每个类的方法,例如 setClass("A", representation(a = 'numeric')) setClass("B", representation(b = 'numeric'), contains="A") setClass("C", representation(c = 'numeric'), contains="B") 方法 setGeneric("toXML", function(obj, node) standard

我有一个对象
C
,它继承了类
B
,它继承了类
A
, 以及每个类的方法,例如

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 = obj@a))
setMethod("toXML", 
          signature("B", "XMLInternalElementNode"), 
          function(obj, node) addAttributes(node, b = obj@b))
setMethod("toXML", 
          signature("C", "XMLInternalElementNode"), 
          function(obj, node) addAttributes(node, c = obj@c))
也就是说,每个类表示XML节点可能具有的属性。
我想写一个方法(或强制)来执行这些函数 适用于所有匹配的类

当然,我写的方式是

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

obj可能通过使用
callNextMethod()

setGeneric(“toXML”,函数(obj,节点)standardGeneric(“toXML”))
setMethod(“toXML”,
签名(“A”、“XMLInternalElementNode”),
函数(obj,节点)添加属性(节点,a=obj@a))
setMethod(“toXML”,
签名(“B”,“XMLInternalElementNode”),
功能(对象、节点){

node精彩绝伦。在阅读文档后,我仍然不清楚为什么要将
callNextMethod
分配给
node
。我觉得这很奇怪;看起来这只是在覆盖其中一个参数,尽管它不是?@cboettig谢谢。您需要(本地)用
callNextMethod()返回的结果覆盖
node
否则这些结果将“消失在乙醚中”。这里没有什么特别的原则,只有R的标准哲学,即除非明确指示,否则不执行赋值(即不作为副作用)。这与您这样做的原因相同:
f对,但这种情况对我来说比x情况要微妙得多,在x情况下,您将数字替换为数字。
addAttributes
要求
节点
参数为“XMLInternalElementNode”类。调用
callNextMethod
(没有参数)如何知道返回此类的对象?@josh obrien在这种情况下,callNextMethod实际返回什么?与
x@cboettig--
callNextMethod()
返回类为
“XMLInternalElementNode”
的对象。请尝试插入
浏览器()
在我用
##
<node c="3"/> 
<node a="1" b="2" c="3"/> 
setGeneric("toXML", function(obj, node) standardGeneric("toXML"))
setMethod("toXML", 
          signature("A", "XMLInternalElementNode"), 
          function(obj, node) addAttributes(node, a = obj@a))
setMethod("toXML", 
          signature("B", "XMLInternalElementNode"), 
          function(obj, node) {
              node <- callNextMethod()            ## <- Line I added
              addAttributes(node, b = obj@b)
              })
setMethod("toXML", 
          signature("C", "XMLInternalElementNode"), 
          function(obj, node) {
              node <- callNextMethod()            ## <- Line I added 
              addAttributes(node, c = obj@c)
          })

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