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. Intente methods("mean")
enumerar los métodos genéricos con el nombre de la función mean
. 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
library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"
Los sistemas de objetos R
S3
- Enfoque funcional de OOP.
- El sistema más importante según Hadley.
- Más simple, más común. Primer sistema OO utilizado por R.
- Viene con la base R, utilizada en toda la base R.
- Se basa en convenciones en lugar de garantías forzadas.
- Ver Chambers, John M y Trevor J Hastie. 1992. "Modelos estadísticos en S." Wadsworth & Brooks / Cole Advanced Books & Software.
- Detalles en "Advanced R, 2nd edition" aquí .
S4
- Enfoque funcional de OOP.
- Tercer sistema más importante según Hadley.
- Reescribe S3, por lo tanto similar a S3, pero más formal y más estricto: te obliga a pensar cuidadosamente sobre el diseño del programa. Adecuado para la construcción de grandes sistemas (por ejemplo, el proyecto Bioconductor ).
- Implementado en el paquete base de "métodos".
- Ver: Chambers, John M. 1998. "Programación con datos: una guía para el lenguaje S". Saltador.
- Detalles en "Advanced R, 2nd edition" aquí .
RC también conocido como "Clases de referencia"
- Enfoque OOP encapsulado.
- Viene con base R.
- Basado en S4.
- Los objetos RC son un tipo especial de objetos S4 que también son "mutables". es decir, en lugar de utilizar la semántica habitual de copiar y modificar de R, se pueden modificar en el lugar. Tenga en cuenta que el estado mutable es difícil de razonar y una fuente de errores feos, pero puede conducir a un código más eficiente en ciertas aplicaciones.
R6
- Enfoque OOP encapsulado.
- Segundo sistema más importante según Hadley.
- Se puede encontrar en el paquete R6 (instalar con
library(R6)
)
- Similar a RC, pero más ligero y mucho más rápido: no depende de S4 o los métodos paquete de . Construido en la parte superior de los entornos R. También tiene:
- métodos públicos y privados
- enlaces activos (campos, que, cuando se accede, en realidad llaman a un método)
- clase de herencia que funciona en paquetes
- ambos métodos de clase (de código que pertenece a la clase y pueden acceder a una instancia a través de
self
, private
, super
) y funciones miembro (funciones asignadas a los campos, pero que no son métodos, funciones sólo)
- Proporciona una forma estandarizada de escapar de la semántica de "copiar en modificar" de R
- Consulte el sitio del paquete: "R6: Programación encapsulada orientada a objetos para R" .
- Detalles en "Advanced R, 2nd edition" aquí .
Otros
Hay otros, como R.oo (similar a RC), proto (basado en prototipos, piense en JavaScript) y Mutatr . Sin embargo, "Advanced R" dice:
Además de R6, que es ampliamente utilizado, estos sistemas son principalmente de interés teórico. Tienen sus puntos fuertes, pero pocos usuarios de R los conocen y los entienden, por lo que es difícil para otros leer y contribuir a su código.
Asegúrese de leer también el capítulo sobre compensaciones en "Advanced R, 2nd edition" .