2013-08-27 2 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 Спасибо. Вы должны (локально) перезаписать 'node' с результатами, возвращаемыми' callNextMethod() ', иначе эти результаты« исчезнут в эфир ». Здесь нет никакого причудливого принципа, только стандартная философия 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

Смежные вопросы