2012-03-16 43 views
14

Estoy desarrollando una actualización importante del paquete R, y como parte de los cambios deseo comenzar a utilizar los métodos S3 para poder usar las funciones genéricas de trazado, resumen e impresión. Pero creo que no estoy totalmente seguro de entender por qué y cuándo usar funciones genéricas en general.Usando funciones genéricas de R, ¿cuándo y por qué?

Por ejemplo, actualmente tengo una función llamada logLikSSM, que calcula la probabilidad logarítmica de un modelo de espacio de estado. En lugar de usar estas funciones, podría hacer la función logLik.SSM o algo así, ya que existe la función genérica logLik en R. El beneficio de esto sería que logLik es más corto de escribir que logLikSSM, pero ¿hay realmente algún otro punto en ¿esta?

Caso similar, hay una función genérica llamada simular en el paquete de estadísticas, por lo que en teoría podría usar eso en lugar de simular SMSM. Pero ahora la descripción de la función de simulación indica que la función se usa para "Simular respuestas", pero mi función en realidad simula los estados ocultos, por lo que realmente no encaja en la descripción de la función de simulación. Entonces, probablemente en este caso no debería usar la función genérica, ¿verdad?

Disculpa si esta pregunta es demasiado vaga aquí.

Respuesta

10

Los ventajas de la creación de métodos para genéricos desde el núcleo de R incluyen:

  1. Facilidad de uso. Los usuarios de su paquete ya familiarizados con esos genéricos tendrán menos que recordar para que sea más fácil usar su paquete. Incluso podrían hacer una cierta cantidad sin leer la documentación. Si creas tus propios nombres, entonces deben descubrir y recordar nuevos nombres, lo cual es una carga cognitiva adicional.

  2. Apalancamiento Funcionalidad existente. También cualquier otra función que haga uso de los genéricos para los que crea métodos puede entonces usar automáticamente la suya también; de lo contrario, tendrían que ser cambiados. Por ejemplo, AIC usa logLik.

A desventaja es que el genérico implica el nivel extra de envío y si logLik es en el bucle interior de una optimización podría haber un impacto (aunque posiblemente no material). En ese caso, podría verificar el rendimiento de llamar al medicamento genérico versus llamar al método directamente y usar el último si hace una diferencia significativa.

En el caso de que su función tenga un propósito completamente diferente al genérico en el núcleo de R, podría ser más confuso que útil, entonces, en ese caso, no cree un método pero tenga su propio nombre de función .

Es posible que desee leer el zoo Design manual (vea el enlace al zoo Design en Viñetas, cerca de la parte inferior de la página) que trata las ideas de diseño que se incluyeron en el paquete del zoológico. Estos incluyen la idea que se discute aquí.

EDITAR: Desventajas añadidas.

+0

Gracias, pensé en la primera ventaja, pero me faltaba el segundo punto. Un buen punto sobre la optimización y logLik, tienen que probar eso.Revisaré el manual del zoológico también. –

4

buena pregunta.

Voy a dividir su pregunta en dos partes; aquí está el primero:

¿Hay realmente algún otro punto en [fabricación de funciones genéricas]?

Bueno, este patrón normalmente se invoca cuando el Develper no sabe la clase de objeto para cada objeto que él/ella espera que un usuario pasa en con el método en cuestión.

Y debido a esta incertidumbre, este patrón de diseño (que se llama sobrecarga en muchos otros idiomas) se invokved, y que requiere de I para evaluar la clase de objeto y, a continuación envían que se opone al método apropiado dada la tipo de objeto.

El segundo parte de su pregunta: [e] n este caso no debería utilizar [la función genérica] ¿verdad?

Para tratar de dar una respuesta útil más allá de los detalles de su pregunta, considere lo que ocurre con el método original cuando se llama setGeneric, de paso, que el método de.

el cuerpo de la función original es reemplazado con código para realizar un despacho de nivel superior basado en el tipo de objeto pasado. Esto reemplaza el cuerpo de la función original, que simplemente se desliza hacia abajo un nivel para que se convierta en el método predeterminado que distribuye la función de nivel superior (genérico).

showMethods() le permitirá ver todos los métodos invocados por la función de despacho recién creada (función genérica).

+0

Gracias, esto me hizo entender mejor el razonamiento detrás de los genéricos. –

0

Y ahora para una gran desventaja:

Facilidad de el mal uso: Los usuarios de su paquete ya está familiarizado con los genéricos podría hacer una cierta cantidad sin leer la documentación.

Y ahí radica la falacia de que los componentes, los objetos reutilizables, los servicios, etc. son una panacea fácil para todos los desafíos del software.

Y por qué la abrumadora mayoría de los softwares son defectuosos, inflados y funcionan de manera incoherente con pocas esperanzas de que el soporte técnico pueda diagnosticar su problema.

FUE UNA razón para la vinculación estática y pequeños ejecutables en el día. Pero esta generación de código ahora, se paga ahora, se depura más tarde si antes, antes de que lleguen los despidos/salida a bolsa, no tiene memoria de los días en que el código realmente funcionaba de manera confiable y la instalación/integración no requería $ 200/hora. Grandes consultores. o hackers que pasan una semana tratando de obtener algún producto de código abierto "simple" instalado y funcionando productivamente.

Pero si desea continuar la tradición de escribir nombres de funciones/métodos cada vez más cortos, sea mi invitado.

Cuestiones relacionadas