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"
问问题
1438 次
1 回答
8
结果ks.test
是(来自文档):
带有“htest”类的列表
所以,实际上"htest"
并不是一个正式的类定义到一个包中,而简单来说,就是将返回的列表的类属性ks.test
设置为"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
,即:
> 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
编辑 :
正如@Martin Morgan 正确指出的那样,您可以使用setOldClass
. 事实上,文档说:
将旧式(又名“S3”)类注册为正式定义的类。Classes 参数是用作类属性的字符向量;特别是,如果有多个字符串,则会模仿旧式类继承。通过 setOldClass 注册允许 S3 类出现在方法签名中,作为 S4 类中的插槽,或作为 S4 类的超类。
因此,此代码工作正常:
> setOldClass("htest")
> setClass("Jergon", representation(fit="htest"))
[1] "Jergon"
于 2012-09-28T09:30:30.547 回答