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"
6
A
답변
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
가 정식 클래스가 아니기 때문에)
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"
멋진 대답; 'setOldClass ("htest")'는 클래스 속성이 htest (S3 클래스) 인 객체를 S4 클래스로 취급하고자하는 공식 (S4) 클래스 시스템에게 알려줍니다. –
@MartinMorgan : 좋은 지적, 질문에 추가됨. – digEmAll