2010-08-30 11 views
66

Programa 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.Cuando vale la pena usar los métodos S4 en la programación R

Definitivamente estoy de acuerdo en que en algunos casos, debe 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 considera la posibilidad de 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 realmente apunta al valor agregado de usar métodos S4 específicamente.

+0

¡Pero S3 es una orientación de objeto legítima! Es incluso más moderno y flexible que S4. – mbq

+0

@mbq: No estoy de acuerdo. S3 es mucho menos formal y puede verse como un mero conjunto de convenciones de nombres. La "Clase" no es más que un atributo de hecho. S3 aún permite una gran flexibilidad que es casi imposible con los métodos S4. Por otro lado, S3 carece de herencia múltiple y validación formal. Puede usar S3 de una manera orientada a objetos, pero no es lo mismo que OOP sensu strictu en mis ojos. –

+2

@Joris ¿Herencia múltiple? Se puede hacer fusionando objetos y sus clases con 'c'. Validación formal? Nadie dijo que OOP debe hacerse con tipeo estricto; Smalltalk es un ejemplo espectacular.En general, creo que OOP es solo una manera, por lo que no existe una OOP "canónica" (sin embargo, las personas generalmente eligen su idioma favorito y dicen que lo define). – mbq

Respuesta

25

Supongo que esto no se aplica directamente a usted, pero si está desarrollando paquetes para Bioconductor existe un incentivo para usar S4 ya que fomentan activamente su uso y lo tienen desde hace una década, por lo que todos los paquetes centrales 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 eso. 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.

25

Mi experiencia está en línea con la tuya, así que uso S3 exclusivamente.

Para aclarar: S4 tiene algunas características ingeniosas (por ejemplo, despacho en múltiples argumentos y comprobación de tipos de ranuras), 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.

+0

Mi experiencia también. – Maiasaura

+1

Entonces, cinco años después ... ¿has seguido con S3? – isomorphismes

+4

@isomorphismes: sip. Sin embargo, estoy interesado en [R6] (https://github.com/wch/R6) como alternativa al S4. –

8

¡Buena pregunta! y espero que genera una cierta discusión reflexiva ...

nunca he utilizado, ni me propongo por las siguientes razones:

  1. Rendimiento
  2. no tengo la paciencia para Entender completamente S4 y su relación con S3.
  3. Sugerencia sintáctica: Prefiero tener object.method() que método (objeto).

Me gusta suguar, ¿qué puedo decir!

+4

Yo tampoco uso S4 porque me gusta 'object.method()'. Y el estilo R de Google dice: "Use objetos y métodos S3 a menos que haya una razón fuerte para usar objetos o métodos S4. Una justificación primaria para un objeto S4 sería usar objetos directamente en el código C++. Una justificación primaria para un S4 genérico/método sería enviar en dos argumentos " – Vince

+12

FWIW, ¿por qué Google es la autoridad en el estilo R? ¿No debería R-core ser una autoridad superior en el asunto? (No es que R-core parezca unificado en su punto de vista sobre el asunto, pero ...). El fandom de la guía de estilo de Google R me molesta un poco por esta razón. – geoffjentry

+4

@geoffjentry hay una parte de mí que se siente exactamente a la manera de decir ... sin embargo, estoy feliz de que la gente esté pensando en el estilo un poco. Y si tener el logotipo de GOOG en el PDF hace que algún economista (o estadístico, etc.) lo lea, entonces estoy de acuerdo. Estoy cansado de intentar leer código que es tan difícil de analizar debido a la formatación y el estilo. –

5

Las clases S4 juegan un papel importante en las estadísticas espaciales (paquete sensu sp), donde la conversión de un tipo de datos al otro parece transparente. 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 manejado con S3 pero podría considerar usar S4 en el futuro.

Con el tiempo, como las cosas se juegan alrededor de un lote, que creen que van a jugar un papel importante en, al menos, las características principales de los diversos ámbitos de I (puede ser que el análisis espacial, la econometría, Environmetrics ...)

+2

De hecho, una parte cada vez mayor de R se recodifica en las clases S4, pero experimento cada vez más problemas al usar esos paquetes. La documentación está dirigida al uso inmediato, pero carece de uso en la programación. Como usted sabe, también tuve problemas con la evaluación de los argumentos de la función utilizando los métodos codificados S4 de una serie de paquetes. Así que tiendo a alejarme de ellos, y esperaba que alguien pudiera mostrarme un buen uso. –

5

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 funciones genéricas (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. impresión().

+0

Lo he visto antes, pero siempre me pregunté cuál era el valor añadido adicional. Aparte de la semántica, no pude encontrar ninguna diferencia con la programación de S3. Pero, sinceramente, no he estado profundizando en eso. –

8

Aprendí S4 para ampliar 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 su interés, spatstat es un buen ejemplo de cómo hacer muchas cosas similares a sp en S3, aunque (como con todo lo espacial ...) casi nunca hay analogías claras entre los datos estructuras en diferentes softwares.

4

Érase una vez, a Roxygen2 no le gustaban los métodos S4. A partir de 2017 (al menos), trabajan juntos.

Tuve la mala suerte 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, y luego considerar las observaciones de los conocidos desarrolladores de paquetes R de este hilo en R-help

Frank Harrell "Si te gusta la informática más el valor de su propia tiempo, use S4 ".

Terry Therneau escribió: Para el 90 por ciento de lo que hago yo prefiero fuertemente la suelta (S3) en lugar de las clases rígidas (S4) .... Mi resumen de S4 S3 vs

S4 tiene un gran incremento en: 1. molestia para escribir 2. dificultad para depurar 3. capacidad de escribir código 4. diseño

S4 muy oscuros ganancias: 5. capacidad de dirigir las conversiones automáticas 6. validar el contenido de un objeto de clase

+3

y no te olvides 'library (fortunes); fortune ('strait jacket') '... –

+0

Actualización desde hace mucho tiempo: Ahora sí –