Para comenzar con S3, mire el código de la median
función. Escribir median
en el símbolo del sistema revela que tiene una línea en su cuerpo, a saber
UseMethod("median")
Eso significa que es un método S3. En otras palabras, puede tener una median
función diferente para diferentes clases de S3. Para enumerar todos los métodos de mediana posibles, escriba
methods(median) #actually not that interesting.
En este caso, solo hay un método, el predeterminado, que se llama para cualquier cosa. Puede ver el código para eso escribiendo
median.default
Un ejemplo mucho más interesante es la print
función, 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. Úselo find
para averiguar en qué paquete están. Por ejemplo
find("acf") #it's in the stats package
stats:::print.acf
Aquí hay un resumen rápido actualizado de los numerosos sistemas de objetos R de acuerdo con "Advanced R, 2nd edition" (CRC Press, 2019) de Hadley Wickham (Chief Scientist en RStudio), que tiene una representación web aquí , basada en el capítulo sobre Object -Programación orientada .
La primera edición de 2015 tiene una representación web aquí , con el capítulo correspondiente sobre OO aquí .
Enfoques de los sistemas OO
Hadley define lo siguiente para distinguir dos enfoques distintos para la programación OO:
OOP funcional : los métodos (piezas de código invocables) pertenecen a funciones genéricas (no deben confundirse con los métodos genéricos Java / C # ). Piense en los métodos como ubicados en una tabla de búsqueda global. El sistema de tiempo de ejecución encuentra el método a ejecutar en función del nombre de la función y el tipo (o clase de objeto) de uno o más argumentos pasados a esa función (esto se denomina "envío de método"). Sintaxis-sabia, las llamadas de método puede parecer como llamadas a funciones comunes:
myfunc(object, arg1, arg2)
. Esta llamada llevaría al tiempo de ejecución a buscar el método asociado al par ("myfunc", typeof (objeto)) o posiblemente ("myfunc", typeof (objeto), typeof (arg1), typeof (arg2))si el idioma lo admite. En el S3 de R, el nombre completo de la función genérica proporciona el par (nombre-función, clase) . Por ejemplo:mean.Date
es el método para calcular la media de las fechas. Intentemethods("mean")
enumerar los métodos genéricos con el nombre de la funciónmean
. El enfoque de OOP funcional se encuentra, por ejemplo, en el pionero de OO Smalltalk , Common Lisp Object System y Julia . Hadley señala que "en comparación con R, la implementación de Julia está completamente desarrollada y es extremadamente eficiente".OOP encapsulada : los métodos pertenecen a objetos o clases, y las llamadas a métodos suelen ser similares
object.method(arg1, arg2)
. Esto se denomina encapsulado porque el objeto encapsula tanto los datos (campos) como el comportamiento. (métodos). Piense en el método como ubicado en una tabla de búsqueda adjunta al objeto o la descripción de clase del objeto. El tiempo de ejecución busca el método en función del nombre del método y posiblemente del tipo de uno o más argumentos. Este es el enfoque que se encuentra en los lenguajes OO "populares" como C ++, Java, C #.En ambos casos, si se admite la herencia (probablemente lo sea), el tiempo de ejecución puede atravesar la jerarquía de clases hacia arriba hasta que encuentre una coincidencia para la clave de búsqueda de llamadas.
Cómo averiguar a qué sistema pertenece un objeto R
Los sistemas de objetos R
S3
S4
RC también conocido como "Clases de referencia"
R6
library(R6)
)self
,private
,super
) y funciones miembro (funciones asignadas a los campos, pero que no son métodos, funciones sólo)Otros
Hay otros, como R.oo (similar a RC), proto (basado en prototipos, piense en JavaScript) y Mutatr . Sin embargo, "Advanced R" dice:
Asegúrese de leer también el capítulo sobre compensaciones en "Advanced R, 2nd edition" .
fuente