为什么有时我不能将类定义设置为s4类中的槽?

时间:2012-09-28 08:07:25

标签: r class s4

r=ks.test(x=rnorm(100), "dnorm")
class(r)
[1] "htest"


## Doesnt work, "htest" is class in stats
setClass("Jergon", representation(fit="htest"))
[1] "Jergon"
Warning message:
undefined slot classes in definition of "Jergon": fit(class "htest")


## works "lm" 
setClass("Jergon", representation(am="lm"))
[1] "Jergon"

1 个答案:

答案 0 :(得分:8)

ks.test的结果是(来自文档):

  

包含课程" htest"

的列表

因此,实际上"htest"不是定义到包中的形式类,但简单地说,ks.test返回的列表的class属性设置为{{ 1}}。

举一个例子,以下代码也不起作用(因为"htest"不是正式的类):

myclass

要检查某个类是否正式定义(并且可以用作表示),您可以使用obj = list(foo=123) class(obj) <- "myclass" class(obj) [1] "myclass" setClass("Jergon", representation(foo="myclass")) [1] "Jergon" Warning message: undefined slot classes in definition of "Jergon": foo(class "myclass") ,即:

getClassDef

编辑:

正如@Martin Morgan正确指出的那样,您可以使用> getClassDef('htest') NULL > getClassDef('lm') Virtual Class "lm" [package "methods"] Slots: Name: .S3Class Class: character Extends: "oldClass" Known Subclasses: Class "mlm", directly Class "aov", directly Class "glm", directly Class "maov", by class "mlm", distance 2 Class "glm.null", by class "glm", distance 2 正式注册旧式S3类。实际上文档说:

  

将旧式(a.k.a。'S3')类注册为正式定义的类。   Classes参数是用作类的字符向量   属性;特别是,如果有多个字符串,旧式   类继承是模仿的。 通过setOldClass注册允许S3   要出现在方法签名中的类,作为S4类中的插槽,或者   作为S4类的超类

因此,此代码可以正常工作:

setOldClass