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 が正しく指摘したように、 を使用して古いスタイルの S3 クラスを正式に登録できますsetOldClass
。実際、ドキュメントには次のように記載されています。
古いスタイル (別名 'S3') クラスを正式に定義されたクラスとして登録します。Classes 引数は、クラス属性として使用される文字ベクトルです。特に、文字列が複数ある場合は、古いスタイルのクラス継承が模倣されます。setOldClass を介して登録すると、S3 クラスをメソッド シグネチャに、S4 クラスのスロットとして、または S4 クラスのスーパークラスとして表示できます。
したがって、このコードは正常に機能します。
> setOldClass("htest")
> setClass("Jergon", representation(fit="htest"))
[1] "Jergon"
于 2012-09-28T09:30:30.547 に答える