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

Odpowiedz

8

Wynik ks.test jest (z dokumentacją):

lista z klasą "htest"

Tak, rzeczywiście "htest" nie jest formalny klasy zdefiniowane w pakiecie , ale po prostu atrybut klasy listy zwróconej przez ks.test jest ustawiony na "htest".

Aby dać przykład, również kod does't pracę (bo myclass nie jest formalnym klasa):

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

Aby sprawdzić, czy klasa jest formalnie zdefiniowane (i mogą być wykorzystane jako reprezentacja), można użyć getClassDef, tj:

> 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 

EDIT:

Jak słusznie zauważył @Martin Morgan, możesz oficjalnie zarejestrować starą klasę S3 przy użyciu setOldClass. W rzeczywistości dokumentacja mówi:

Zarejestruj klasę staroświecką (a.k.a. "S3") jako formalnie zdefiniowaną klasę. Argumenty Klasy to wektor znaków używany jako atrybut klasy ; w szczególności, jeśli istnieje więcej niż jeden ciąg znaków, dziedziczenie klas starego stylu jest naśladowane. Rejestracja za pomocą setOldClass pozwala klasom S3 pojawiać się w podpisach metod, jako boks w klasie S4 lub jako nadklasa klasy S4.

Stąd ten kod działa poprawnie:

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

Nicea odpowiedź; 'setOldClass (" htest ")' mówi systemowi klasy formalnej (S4), że chcesz traktować obiekt z atrybutem klasy 'htest' (klasa S3) jako klasą S4. –

+0

@MartinMorgan: dobry punkt, dodany do pytania. – digEmAll

Powiązane problemy