2012-09-28 2 views
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" 

답변

8

ks.test의 결과는 (문서에서)입니다 : 클래스

목록은 "htest는"

그래서, 실제로 "htest"는 패키지에 정의 된 공식 클래스되지 않습니다 단순히 ks.test에 의해 반환 된 목록의 클래스 속성은 "htest"으로 설정됩니다.

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") 

클래스가 공식적으로 정의되어 있는지 확인하려면 (그리고로 사용할 수 있습니다 : (myclass가 정식 클래스가 아니기 때문에)

는 예를 제공하기 위해, 또한 다음 코드는 작업을 does't 표현), 당신은 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 클래스를 공식적으로 등록 할 수 있습니다. 실제로 설명서에 다음과 같이 쓰여 있습니다 :

이전 스타일 (a.k.a. 'S3') 클래스를 공식 정의 된 클래스로 등록하십시오. Classes 인수는 클래스 속성으로 사용되는 문자 벡터입니다. 특히 하나 이상의 문자열이있는 경우 이전 스타일 클래스 상속이 모방됩니다. setOldClass 통해 등록 는 S3 S4 클래스는 클래스의 수퍼 클래스 같은 S4 클래스 슬롯 또는 같은 메소드 서명에 표시 할 수있다.

따라서,이 코드는 잘 작동 :

> setOldClass("htest") 
> setClass("Jergon", representation(fit="htest")) 
[1] "Jergon" 
+3

멋진 대답; 'setOldClass ("htest")'는 클래스 속성이 htest (S3 클래스) 인 객체를 S4 클래스로 취급하고자하는 공식 (S4) 클래스 시스템에게 알려줍니다. –

+0

@MartinMorgan : 좋은 지적, 질문에 추가됨. – digEmAll