困惑于如何从包中扩展S3类' XML'

时间:2016-01-25 14:32:57

标签: xml r oop inheritance

我试图从包XML扩展S3对象。我对S3类的理解是R寻找正确的函数来应用类向量中的每个类,从左到右,如果没有为当前类定义函数,则移动到下一个类。例如,使用lm对象:

ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
group <- gl(2, 10, 20, labels = c("Ctl","Trt"))
weight <- c(ctl, trt)
x <- lm(weight ~ group)
pryr::otype(x)

[1]&#34; S3&#34;

class(x) <- append("MyLMClass", class(x)) # adding class
print.MyLMClass <- function(x) cat("this is from MyLMClass") # overriding print
x

这是来自MyLMClass

summary()未定义MyLMClass,但在x上调用它确实有效,因为R会转到下一个类lm

summary(x)

呼叫: lm(公式=重量〜组)

残差:     Min 1Q Median 3Q Max -1.0710 -0.4938 0.0685 0.2462 1.3690

系数:             估计标准。误差t值Pr(&gt; | t |)
(拦截)5.0320 0.2202 22.850 9.55e-15 ***

(等)

但这对XML对象不起作用:

library(XML)
someXML <- newXMLNode("a")
newXMLNode("g", 3, parent = someXML)
newXMLNode("c", 5, parent = someXML)
someXML

<a>
  <g>3</g>
  <c>5</c>
</a>
pryr::otype(someXML)
[1] "S3"

getNodeSet(someXML, "/a/c/")[[1]]给出了:

<c>5</c>

但是一旦我添加了一个新类,没有任何作用,甚至不打印:

> class(someXML) <- append("MyClass", class(someXML))
> someXML
Error in as.vector(x, "character") : 
  cannot coerce type 'externalptr' to vector of type 'character'

> getNodeSet(someXML,"/a/c")[[1]]
Error in as(doc, "XMLInternalDocument") : 
  no method or default for coercing “MyClass” to “XMLInternalDocument”

我希望能够扩展XML对象,以便:

  • 我可以直接使用XML包中的所有函数,而无需为我设计的每个新类重新定义它们。
  • 我可以为我的新类(例如MyClass)定义新函数,并覆盖更专业的类的现有函数(例如MyClass2,MyClass的子类,XML对象的子类)

我怎样才能做到这一点?

(似乎getNodeSet()不是S3泛型,这可能解释了为什么它不适用于新类。)

编辑: 将someXML投射到XMLDocument会使getNodeSet()工作:

someXML <- newXMLNode("a")
newXMLNode("g", 3, parent = someXML)
newXMLNode("c", 5, parent = someXML)
someXML <- newXMLDoc(someXML) # <== that's new
class(someXML) <- append("MyClass", class(someXML))
class(someXML) <- append("MyClass2", class(someXML))
getNodeSet(someXML,"/a/c")[[1]]
<c>5</c> 

print()仍然无效:

someXML
Error in as.vector(x, "character") : 
  cannot coerce type 'externalptr' to vector of type 'character'

0 个答案:

没有答案