困惑于如何从包';XML';

困惑于如何从包';XML';,xml,r,oop,inheritance,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("Ct

我试图从包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)
电话: lm(公式=重量~组)

残差: 最小1季度中值3季度最大值 -1.0710-0.4938 0.0685 0.2462 1.3690

系数: 估计标准误差t值Pr(>t)
(截距)5.0320 0.22022.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"
但一旦我向其中添加了一个新类,就没有任何效果,甚至打印也不行:

> 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”
但是
print()
仍然不起作用:

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

非常肯定XML在很多地方使用了S4类。
pryr::otype(someXML)
在这两种情况下都给了我
S3
(有或没有
XMLDocument
cast)。非常肯定XML在很多地方使用了S4类。
pryr::otype(someXML)
在这两种情况下都给了我
S3
(带或不带
XMLDocument
cast)。
<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”
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> 
someXML
Error in as.vector(x, "character") : 
  cannot coerce type 'externalptr' to vector of type 'character'