6
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"
4

1 に答える 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 に答える