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
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"
- 1. ¿Por qué puede crear una clase en su definición?
- 2. 'Clase' no contiene una definición para 'Método'
- 3. Obteniendo el valor de una ranura de objetos S4?
- 4. Python: ¿Por qué no puedo usar `super` en una clase?
- 5. ¿Qué significa una tubería en una definición de clase?
- 6. ¿Por qué no puedo almacenar una instancia de clase PHP como variable de SESSION?
- 7. ¿Por qué no puedo usar HttpServerUtility.HtmlEncode dentro de una clase?
- 8. Por qué no puedo realizar varias declarar una clase
- 9. Definición de clase de una línea?
- 10. ¿Cómo puedo requerir un atributo en una definición de clase?
- 11. ¿Por qué sellar una clase?
- 12. ¿Por qué no puede tener require * declaraciones en una definición de clase?
- 13. En Ruby or Rails, ¿por qué "incluir" a veces dentro de la clase y, a veces fuera de la clase?
- 14. Ejemplo de uso de una clase S3 en un objeto S4
- 15. ¿Puedo declarar una cadena en un archivo de encabezado en una definición de una clase?
- 16. instrucción no local de Python en una definición de clase
- 17. ¿Por qué no puedo acceder a un miembro protegido desde una instancia de una clase derivada?
- 18. ¿Por qué no puedo llamar a métodos dentro de una clase que implementa explícitamente una interfaz?
- 19. Decapado de una definición de clase
- 20. ¿Por qué los operadores son a veces independientes y, a veces, métodos de clase?
- 21. ¿Por qué no puedo establecer un padre QObject en una clase de la cual QObject es solo una base indirecta?
- 22. Por qué tienen clase estática pública dentro de una clase
- 23. Por qué solo una clase por archivo
- 24. ¿Por qué C# no requiere un punto y coma después de una definición de clase?
- 25. ¿Por qué declarar como final una referencia a una instancia de una clase final?
- 26. ¿Por qué es necesario marcar una clase como serializable?
- 27. ¿Por qué es android.os.Bundle una clase final?
- 28. ¿Cómo establecer el valor predeterminado de una ranura como NULL en R?
- 29. ¿Por qué esta ranura se llama dos veces?
- 30. C++ ¿Cómo es que no puedo asignar una clase base a una clase para niños?
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. –
@MartinMorgan: buen punto, añadido a la pregunta. – digEmAll