objects classes r oop

objects - classes in r



Crear clases en R: S3, S4, R5(RC) o R6? (1)

Parece que ya conoce algunas de las definiciones y usos para los diversos tipos de OOP. Daré mi opinión sobre cuándo es apropiado usar cuál.

  1. Utilice las clases S3 para situaciones en las que se aplican las dos condiciones siguientes: (a) su objeto es estático y no se modifica por sí mismo, y (b) no le interesan las firmas de métodos de múltiples argumentos, es decir, su método se distribuye puramente en su primer argumento , la clase S3 del objeto. Además, las clases S3 son una buena solución cuando puedes vivir con estas restricciones y quieres sobrecargar a muchos operadores.

  2. Utilice las clases S4 si su objeto es estático y no se auto modifica, pero le importan las firmas de métodos de múltiples argumentos. Desde mi experiencia, S4 OOP siempre ha sido más complicado de lo que vale, aunque "garantiza" la seguridad del tipo en cierta medida.

  3. Use clases de referencia si su objeto es auto modificable. De lo contrario, deberá definir muchos métodos de reemplazo (por ejemplo, some_method<- , que se llama con la sintaxis some_method(obj) <- value ). Esto es incómodo y computacionalmente lento, ya que R creará una copia completa del objeto cada vez. R6 es un buen sustituto, aunque no lo he encontrado necesario para mis propósitos.

La mayoría de las personas nuevas en R creen que está confundido; que la razón por la que hay tantas implementaciones de OOP es porque no hubo consenso.

Esto es incorrecto.

Debido a su naturaleza estadística, la mayoría de las estructuras heterogéneas en R (es decir, cosas que deberían ser objetivas) terminan siendo el resultado de un algoritmo estadístico: un objeto lm, glmnet, gbm, etc. Por lo general, es suficiente agrupar esta información y proporcionar las interfaces esperadas para resumirla: print , summary , etc.

Debido a su legado como campo de juego estadístico, esto libera al usuario de tener que pensar en conceptos más avanzados como la herencia y la asignación / desasignación, y abre el campo de juego a más contribuyentes. Esto significa que es un poco más molesto crear proyectos complejos (por ejemplo, servidores web, analizadores de texto, interfaces gráficas, etc.) en R que en un lenguaje típico manejado por objetos como Ruby, pero la falta de un tipo OOP uniforme es equilibrado por la facilidad de uso.

Una forma final de pensarlo es que los diferentes enfoques son como transiciones de fase en la materia: sólido, gaseoso, líquido. En lugar de tratar todas las estructuras heterogéneas (es decir, cosas similares a OOP) de manera uniforme, algunas caen más naturalmente bajo una estructura que otra. Si estoy envolviendo una lista simple en una clase S3 para mostrar bien con un método de print sobrecargado, sería bastante tonto configurar una clase de referencia completa para este propósito.

Estoy publicando una pregunta abierta para buscar ventajas o desventajas en la creación de nuevas clases en R. Por lo que puedo decir, hay esencialmente cuatro paradigmas diferentes que se usan al crear clases en R, S3, S4, R5 (o RC) ) y R6.

S3 es lo que utilizan la mayoría de las bibliotecas centrales de R, y parece que tiene algún mérito seguir el patrón simple y ligeramente estructurado de utilizar el envío de métodos genéricos. Me gustaría evitar usar esto por otras razones que no me resultan claras, como la encapsulación, las definiciones de métodos, etc. Por ejemplo, parece bastante engorroso cuando se estructura una clase, porque los métodos genéricos se definen fuera del clase y cosas de esa naturaleza.

S4 no parece ser mejor, pero tiene una noción de seguridad de tipo pobre involucrada en él, para cometer errores obvios que podrían surgir más aparentes. Sin embargo, todavía siento que las clases de S4 son difíciles de mantener en el sentido de que no estoy seguro de cosas como la encapsulación y las relacionadas con estas clases. Otra cosa que parece confundirme es que hay poca o ninguna noción de espacio de nombres.

R5 parece ser un poco más similar a lo que estoy acostumbrado, donde las definiciones de métodos están vinculadas a clases, en lugar de funciones de despacho. Aquí, hay un poco más de pensamiento que entra en juego al organizar un objeto en términos de una clase a la que estaría acostumbrado. Una posible desventaja es que R5 también se construye a partir de S4.

R6 parece ser una reescritura de R5 por un individuo que agrega más características de OOP a la mezcla, como funciones y propiedades privadas y públicas, pero de otra manera no puedo encontrar ningún soporte para estas clases, ya que la información sobre ellas parece ser escasa Búsqueda de Google

Como puede ver, estoy luchando con los conceptos OO en R y parece que no puedo entender las siguientes facetas que normalmente están asociadas con OOP:

  1. Tipo Seguridad / Tipos
  2. Método / enlace de objetos, encapsulación, variables de miembros, etc.
  3. Código de espaciado y organización de nombres
  4. Versiones de herencia.

Me pregunto si alguien puede proporcionar una respuesta que pueda describir cuál es el sistema de clases preferido en la comunidad R, y cuál es la mejor manera de pensar cuándo utilizar las clases.