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" 

Respuesta

8

El resultado de ks.test es (a partir de la documentación):

Una lista con la clase "htest"

Así que, en realidad "htest" no es un formal de clase definido en un paquete , pero simplemente, el atributo de clase de la lista devuelta por ks.test, se establece en "htest".

Para dar un ejemplo, también el siguiente código does't trabajo (porque myclass no es una clase formal):

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

para comprobar si una clase es formalmente definido (y se puede utilizar como la representación), puede utilizar getClassDef, es decir:

> 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:

Como señaló correctamente @Martin Morgan, puede registrar formalmente una clase S3 antigua usando setOldClass. De hecho, la documentación dice:

Registre una clase antigua (a.k.a. 'S3') como una clase formalmente definida. El argumento Clases es el vector de caracteres utilizado como el atributo de clase ; en particular, si hay más de una cadena, se imita la herencia de clase de estilo antiguo. El registro a través de setOldClass permite que las clases S3 aparezcan en las firmas de métodos, como una ranura en una clase S4, o como una superclase de una clase S4.

Por lo tanto, este código funciona bien:

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

respuesta Niza; 'setOldClass (" htest ")' le dice al sistema de clase formal (S4) que le gustaría tratar un objeto con un atributo de clase 'htest' (clase S3) como una clase S4. –

+0

@MartinMorgan: buen punto, añadido a la pregunta. – digEmAll

Cuestiones relacionadas