oop - programación - r studio español
¿Cuándo vale la pena usar los métodos S4 en la programación R? (7)
Érase una vez, a Roxygen2 no le gustaban los métodos S4. A partir de 2017 (al menos), trabajan juntos.
Tuve la desgracia de crear algunas funciones que necesitaban métodos para trabajar con las clases S3 y S4. Ha sido increíblemente doloroso mantener este código funcionando a lo largo de los años, ya que R-core ha cambiado muchas veces los detalles sobre cómo estos sistemas interactúan y cómo funcionan los espacios de nombres y cómo funciona el control de Rcmd.
Si no te gusta la guía de estilo de Google, considera los comentarios de estos conocidos desarrolladores de paquetes R de este hilo en R-help
Frank Harrell "Si te gusta la informática más de lo que valoras tu propio tiempo, usa S4".
Terry Therneau escribió: Para el 90 por ciento de lo que hago, prefiero las clases sueltas (S3) en lugar de las rígidas (S4) ... Mi resumen de S4 vs S3
S4 tiene un gran incremento en: 1. molestia para escribir 2. dificultad para depurar 3. capacidad para escribir código muy oscuro 4. diseño
S4 Gains: 5. capacidad de dirigir conversiones automáticas. 6. validar el contenido de un objeto de clase
Me programo regularmente en R en un contexto profesional, y también escribo paquetes para clientes o compañeros de trabajo. Algunos de los programadores aquí tienen una base de Java e insisten en hacer todo de la manera orientada a objetos, utilizando métodos S4. Por otro lado, mi experiencia es que las implementaciones de S4 a menudo funcionan peor y causan más dolores de cabeza cuando se intenta hacer que el código haga lo que usted quiere que haga.
Definitivamente estoy de acuerdo en que, en algunos casos, debes ser capaz de construir objetos complejos o anexar objetos existentes de forma controlada. Pero la mayoría de las veces, las implementaciones de S4 también se pueden hacer fácilmente usando listas clásicas, sin todas las molestias como definir StandardGeneric, métodos, constructores, inicializadores y "me gusta".
¿Cuándo consideras escribir implementaciones S4 para R?
EDITAR: Para mayor claridad, aprecio las respuestas y la discusión sobre OO en general en R. OOP se puede hacer de muchas maneras en R, pero mi pregunta está realmente dirigida al valor agregado de usar métodos S4 específicamente.
Aprendí S4 para extender las clases espaciales (sp) para datos de seguimiento de animales. Fue la mejor opción (la más consistente, general y cercana a muchas definiciones SIG) de las opciones disponibles para evitar escribir todo lo requerido desde cero. No creo que S4 sea tan oneroso como mucha gente dice, pero ahora estoy acostumbrado a explorar la estructura subyacente de objetos como este. El rendimiento también es bueno, creo que se puede hacer bien, aunque cuando se hace mal hay trampas de rendimiento.
Si los datos espaciales son de interés para usted, spatstat es un buen ejemplo de cómo hacer muchas cosas similares a sp en S3, aunque (como con todo lo espacial parece ...) casi nunca hay analogías claras entre las estructuras de datos en diferentes softwares. .
Gran pregunta! y espero que genere una discusión reflexiva ...
Nunca lo he usado, ni lo intento por las siguientes razones:
- Actuación
- No tengo la paciencia para comprender completamente S4 y su relación con S3.
- Sugerencia sintáctica: Prefiero tener object.method () que method (object).
Me gusta sugerir, ¿qué puedo decir?
Las clases S4 juegan un papel importante en las estadísticas espaciales (sensu package sp
), donde la conversión de un tipo de datos al otro parece ser perfecta. La trampa de esto es la depuración, que ha sido, en mi experiencia, tediosa en el mejor de los casos. Hasta ahora, lo he logrado con S3 pero podría considerar usar S4 en el futuro.
Con el tiempo, cuando las cosas se juegan mucho, creo que jugarán un papel importante en al menos las principales características de varios campos de R (puede ser el análisis espacial, la econometría, el medio ambiente ...)
Mi experiencia está en línea con la tuya, así que uso S3 exclusivamente.
Para aclarar: S4 tiene algunas características pulidas (por ejemplo, despacho en múltiples argumentos y comprobación de tipo de ranura), pero no he encontrado una situación en la que las características superan los costos. Algunos ejemplos de los costos incluyen: cualquier cambio de espacio requiere una copia completa del objeto y (potencialmente peor) los cambios en curso en los Métodos S4.
En resumen, me gusta la idea detrás de S4, pero esperaría a que madure antes de usarlo en mi propio código.
No olvide que también hay R.oo (en CRAN) que proporciona una tercera forma de hacer OO en R. En mi opinión, esto proporciona un sistema OO que podría ser más familiar para los programadores que migran de otros sistemas, en particular en lugar de tener genéricos funciones (para que print (foo) luego tenga que despachar en la clase de foo) los métodos estén ligados al objeto, por lo que harías foo $ print () - al igual que en python o C ++ harías foo.print ().
Supongo que esto no se aplica directamente a ti, pero si estás desarrollando paquetes para Bioconductor, hay un incentivo para usar S4, ya que fomentan activamente su uso y lo tienen durante la mayor parte de una década, así que todo el núcleo los paquetes hacen un uso intensivo de S4.
Encuentro que toda la sobrecarga adicional es un problema: setGeneric, setMethod, que trata con NAMESPACE, etc. Habiendo dicho eso, me parece que la estructura que impone, el potencial para la extensibilidad y otras cosas similares pueden valer la pena. Como con todo, hay intercambios involucrados. Creo que puede ser mucho más limpio. No me gusta cómo los métodos S3 simplemente se disfrazan nombrando convenciones (foo.class). Dicho todo esto, tiendo a evitar usar S4 en mi propio código a menos que me digan que lo haga.