Como soy bastante nuevo en R, no sé qué son los métodos y objetos S3. Descubrí que hay sistemas de objetos S3 y S4, y algunos recomiendan usar S3 sobre S4 si es posible (http://google-styleguide.googlecode.com/svn/trunk/google-r-style.html). Sin embargo, no conozco la definición exacta de los métodos/objetos S3.¿Qué significa "métodos S3" en R?
Respuesta
La mayor parte de la información relevante se puede encontrar examinado ?S3
o ?UseMethod
, pero en pocas palabras:
S3 se refiere a un esquema de despacho método. Si ha usado R por un tiempo, notará que hay métodos print
, predict
y summary
para una gran cantidad de diferentes tipos de objetos.
En S3, esto funciona por:
- ajuste de la clase de objetos de interés (por ejemplo: el valor de retorno de una llamada al método de
glm
tiene claseglm
) - proporcionar un método con el en general nombre (por ejemplo
print
), entonces un punto, y entonces el nombre de clase (por ejemplo:print.glm
) - algunos preparación tiene que haber sido hecho a este nombre general (
print
) para que esto funcione, pero si usted está buscando simplemente para ajustarse a sí mismo a nombres de los métodos existentes, no es necesario este (véase la ayuda que refered a anterior si hacer).
Para el ojo del espectador, y en particular, el usuario de su paquete de ajuste del modelo moderno de nueva creación, es mucho más conveniente para ser capaz de escribir predict(myfit, type="class")
que predict.mykindoffit(myfit, type="class")
.
Hay bastante más para eso, pero esto debería comenzar. Hay muchas desventajas en esta forma de distribuir métodos basados en un atributo (clase) de objetos (y los puristas de C probablemente estén despiertos por la noche con horror), pero para muchas situaciones, funciona decentemente. Con la versión actual de R, se han implementado formas más nuevas (S4 y clases de referencia), pero la mayoría de las personas (solo) usan S3.
Para comenzar con S3, observe el código de la función median
. Typing median
en el símbolo revela que tiene una línea en su cuerpo, a saber
UseMethod("median")
Eso significa que es un método de S3. En otras palabras, puede tener una función diferente median
para diferentes clases S3. Para una lista de todos los posibles métodos mediana, escriba
methods(median) #actually not that interesting.
En este caso, sólo hay un método, el valor por defecto, que se llama para nada. Se puede ver el código de ese escribiendo
median.default
Un ejemplo mucho más interesante es la función print
, que tiene muchos métodos diferentes.
methods(print) #very exciting
Tenga en cuenta que algunos de los métodos tienen *
s junto a su nombre. Eso significa que están ocultos dentro del espacio de nombres de algunos paquetes. Utilice find
para averiguar cuál es el paquete que se encuentran. Por ejemplo
find("acf") #it's in the stats package
stats:::print.acf
Trate
methods(residuals)
que enumera, entre otros, "residuals.lm" y "residuals.glm". Esto significa que cuando haya ajustado un modelo lineal, m, y escriba residuals(m)
, se invocará residuals.lm. Cuando haya ajustado un modelo lineal generalizado, se invocará residuals.glm. Es una especie de modelo de objeto C++ invertido. En C++, usted define una clase base que tiene funciones virtuales, que son anuladas por derivadas clasificadas. En R, define una función virtual (también conocida como genérica) y luego decide qué clases anularán esta función (es decir, definir un método). Tenga en cuenta que las clases que hacen esto no necesitan derivarse de una superclase común. No me gustaría generalmente preferir S3 sobre S4. S4 tiene más formalismo (= más tipeo) y esto puede ser demasiado para algunas aplicaciones. Sin embargo, las clases de S4 se pueden definir como una clase o estructura en C++. Puede especificar que un objeto de cierta clase se compone de una cadena y dos números, por ejemplo:
setClass("myClass", representation(label = "character", x = "numeric", y = "numeric"))
métodos que son llamados con un objeto de esa clase puede confiar en el objeto que tiene esos miembros. Eso es muy diferente de las clases S3, que son solo una lista de varios elementos.
Con S3 y S4, llama a una función miembro por fun(object, args)
y no por object$fun(args)
. Si está buscando algo como esto último, eche un vistazo al paquete proto.
Llegué a esta pregunta principalmente preguntándome de dónde venían los nombres. De this wikipedia article parece que el nombre se refiere a la versión del lenguaje de programación S en que se basa R. Los esquemas de despacho de métodos descritos en las otras respuestas provienen de S y están etiquetados apropiadamente según la versión.
De http://adv-r.had.co.nz/OO-essentials.html:
tres sistemas OO de R difieren en cómo se definen las clases y métodos:
S3 implementa un estilo de programación orientado a objetos denominada función genérica OO. Esto es diferente de la mayoría de los lenguajes de programación, como Java, C++ y C#, que implementa OO de paso de mensajes. Con la transmisión de mensajes, los mensajes (métodos) se envían a objetos y el objeto determina a qué función llamar . Normalmente, este objeto tiene una apariencia especial en la llamada al método , que generalmente aparece antes del nombre del método/mensaje: p. canvas.drawRect ("azul"). S3 es diferente. Mientras los cálculos todavía son llevados a cabo mediante métodos, un tipo especial de función llamada función genérica decide qué método llamar, por ejemplo, drawRect (lienzo, "azul"). S3 es un sistema muy informal. No tiene una definición formal de clases.
S4 funciona de manera similar a S3, pero es más formal. Hay dos diferencias principales de a S3.S4 tiene definiciones de clases formales, que describen la representación y herencia de para cada clase, y tiene funciones auxiliares especiales para definir genéricos y métodos. S4 también tiene un despacho múltiple , lo que significa que las funciones genéricas pueden elegir métodos basados en la clase de cualquier número de argumentos, no solo uno.
Las clases de referencia, llamadas RC para abreviar, son bastante diferentes de S3 y S4. RC implementa OO de paso de mensajes, por lo que los métodos pertenecen a las clases , no a las funciones. $ se usa para separar objetos y métodos, por lo que las llamadas al método se ven como canvas $ drawRect ("blue"). Los objetos RC también son mutables: no usan la semántica habitual de copiar-en-modificar de R, pero están modificados en su lugar. Esto los hace más difíciles de razonar, pero les permite resolver problemas que son difíciles de resolver con S3 o S4.
También hay otro sistema que no es del todo OO, pero es importante mencionar aquí:
- tipos de bases, los tipos de nivel C internas que subyacen a la otra OO sistemas. Los tipos base se manipulan principalmente con código C, pero son importantes de conocer porque proporcionan los bloques de construcción para los otros sistemas OO.
- 1. ¿Qué significa, por ejemplo,% +% do? en R
- 2. ¿Qué significa el símbolo @ en R?
- 3. DOM4: propiedades y métodos obsoletos, ¿qué significa?
- 4. ¿Qué significa "~" en python?
- 5. Documentar dos métodos S3 en el mismo archivo con Roxygen
- 6. ¿Qué significa func en el conjunto de instrucciones R-Format?
- 7. ¿Qué significa = <c-r> en Vim
- 8. ¿Qué significa una fórmula multiparte R en términos matemáticos?
- 9. ¿Qué significa redefinir los métodos estáticos en Java?
- 10. Obtener métodos Objeto R
- 11. ¿Qué ... = ... hacer en R?
- 12. ¿Qué significa "?" significa en Java?
- 13. ¿Qué significa '??' significa en C#?
- 14. ¿qué significa "$ &" significa en Ruby
- 15. ¿Qué significa preceder a un literal de cadena con "r"?
- 16. ¿Qué significa '?' hacer en C++?
- 17. ¿Qué significa "profundidad de herencia" para los métodos?
- 18. ¿Qué significa "babosa" significa
- 19. ¿Qué significa Field.Index.NOT_ANALYZED_NO_NORMS significa
- 20. ¿Qué significa ('../') significa?
- 21. Fuentes sobre objetos S4, métodos y programación en R
- 22. ¿Qué significa/*! */Mean en C#?
- 23. Distinguir mediante programación los objetos S3 y S4 en R
- 24. ¿Qué significa "= 0" en C++?
- 25. Combinación de métodos S4 y S3 en una sola función
- 26. ¿Qué significa() => en C#?
- 27. ¿Qué significa el operador `#` en Scala?
- 28. ¿Qué significa exc_breakpoint en depuración?
- 29. ¿Qué significa "1"? significa en Perl?
- 30. ¿Qué significa "% .6d" significa en printf
Estoy bastante seguro de que la idea de funciones y métodos que pertenecen a objetos miembro no tiene mucho sentido en R. Métodos no pertenecen a objetos (también funciones son objetos también), sino que pertenecen a la función. – petermeissner
[ver aquí] (http://adv-r.had.co.nz/OO-essentials.html#s3) – petermeissner