¿Por qué y cuándo crear un paquete R?

28

Entiendo que esta pregunta es bastante amplia, pero me pregunto cuáles deberían ser los puntos decisivos para decidir crear (o no) un nuevo paquete para R. Para ser más específico, agregaría que la pregunta no se trata de las razones para use R en sí mismo, más sobre la decisión de compilar varios scripts e integrarlos en un nuevo paquete.

Entre los puntos que podrían conducir a estas decisiones, he pensado (de una manera bastante no exhaustiva), en:

  • la inexistencia de otros paquetes en el mismo subcampo;
  • la necesidad de intercambiar con otros investigadores y permitir la reproducibilidad de los experimentos;

Y entre los puntos que podrían conducir a una decisión contraria:

  • parte de los métodos utilizados ya presentes en algunos otros paquetes;
  • El número de nuevas funciones no es suficiente para justificar la creación de un nuevo paquete independiente.

Podría haber olvidado muchos puntos que podrían ir en cualquier lista, y también, estos criterios parecen parcialmente subjetivos. Entonces, ¿qué diría que debería justificar, y en qué punto, comenzar a reunir varias funciones y datos en un nuevo paquete documentado y ampliamente disponible?

Campamentos Jean-Baptiste
fuente

Respuestas:

17

No programo en R, pero programo lo contrario, y no veo ningún problema específico de R aquí.

Me imagino que la mayoría de las personas primero escriben algo porque realmente lo quieren para sí mismas. Por el contrario, cualquier sentimiento de que uno debería estar publicando software porque es lo que hay que hacer debe resistirse con fuerza. Las personas inteligentes pueden ser pésimos programadores, y a menudo lo son.

Hacer público parece ser una cuestión de confianza en que tiene algo que es tan bueno o mejor que lo que ya es público y llena un vacío. Saber que otras personas quieren hacer lo mismo seguramente es un impulso.

Si tiene dudas, no publique. En muchas comunidades, existe un problema de control de calidad de software mediocre o con errores lanzado por programadores no críticos o sin experiencia, aunque lo grave que es el problema permanece abierto al debate. Los optimistas creen que las curiosidades pueden ignorarse y que los usuarios expondrán errores y limitaciones lo suficientemente rápido; los pesimistas sienten que nos estamos ahogando en cosas de baja calidad y es difícil distinguir a los ganadores de los perdedores. (Por otro lado, la experiencia obtenida de la publicación es parte de lo que permite a los programadores mejorar).

Podría haber un libro sobre esto, pero se me ocurren algunos consejos:

  1. La documentación de buena calidad distingue el buen software y el buen código, de hecho, a veces, de manera más obvia. Nunca subestimes cuánto trabajo se necesitará para proporcionar la documentación que merece el código. Los programadores de R a menudo parecen requerir que los usuarios de R sepan lo mismo que saben sobre la técnica que se está implementando y documenten mínimamente ...

  2. En la medida de lo posible, pruebe su código para poder reproducir soluciones publicadas con datos reales de otros lugares. (Si está codificando algo totalmente nuevo, eso puede ser más difícil, pero no imposible. Además, a menudo se preguntará si es su error o el suyo).

  3. Los programadores a menudo subestiman la capacidad de los usuarios para arrojar datos inadecuados a un programa. Entonces, piense en lo que podría salir mal, por ejemplo, con valores faltantes, ceros si un programa asume positivo, etc., etc. (La idea benigna aquí es que es tarea de los usuarios encontrar los problemas y mejorar el código a través de sus comentarios , pero un programa que se descompone fácilmente no mejorará su reputación).

Nick Cox
fuente
1
No podría estar más de acuerdo con estos tres puntos (aunque el punto 2 no se aplicaría en mi caso particular, ya que diseñé el método en cuestión). El tercer punto es muy importante y, en términos más generales, plantea el problema del nivel de información que uno puede esperar del usuario (o: para quién lanzamos un paquete): si solo codificamos para especialistas del campo, familiares con el método en cuestión, o intente hacer que nuestro paquete sea utilizable por académicos interesados ​​que no hayan leído todos los artículos relacionados?
Jean-Baptiste Camps
2
# 2 siempre se aplica a "probar su código"! Diferentes personas tienen diferentes estilos en el último punto, y no hay una respuesta correcta. Podría tomar la línea de que no es trabajo de un programador explicar lo que está bien explicado en otra parte, o inútil documentar un programa, excepto explicando el uso. En la comunidad de Stata, donde estoy activo, la buena documentación parece muy apreciada y su falta es preocupante, pero la comunidad R debe tener sus propias costumbres.
Nick Cox
sobre distinguir a los ganadores de los perdedores y sus puntos muy válidos: # 1: afortunadamente, hay algunos puntos en R que se pueden verificar fácilmente , y que apuntan hacia una mejor documentación que solo las páginas de ayuda formales requeridas. ¿Se proporciona una viñeta ( sos::findFnconsidera este criterio lo suficientemente importante como para poner esta información en la tabla de resultados)? Una demo? ¿Una página web con más información? Proporciona citationun documento o libro # 2 adecuado con el que puede enviar datos de ejemplo con su código, por lo que incluso si no hay otra implementación con la que pueda probar su código, ahora otros pueden probar su implementación con el suyo.
cbeleites apoya a Monica
1
"Los programadores de R a menudo parecen requerir que los usuarios de R sepan lo mismo que saben sobre la técnica que se está implementando y documentan mínimamente ..." - Es importante distinguir la documentación del código frente al método estadístico . La documentación de R no es absolutamente el lugar para aprender métodos estadísticos. Incluso las viñetas asumen un cierto nivel de sofisticación. Demasiadas quejas sobre la documentación mínima en R realmente equivalen a quejarse de que los documentos no les están suministrando información estadística.
joran
2
La elipsis ... tenía la intención de señalar una irónica a un lado. Corresponde a la comunidad R establecer sus propios estándares, o al menos debatirlos.
Nick Cox
14

Esta es una pregunta importante y práctica. Comencemos por distinguir entre escribir un paquete y publicarlo en CRAN.

Razones para no escribir un paquete:

  • Eficiencia de costo.
  • Falta de experiencia.

Razones para escribir un paquete R:

  • Compartir con personas y plataformas.
  • Fuerza un código ordenado y un proceso de trabajo.
  • Facilidad de uso (incluso para uno mismo) cuando las funciones comienzan a acumularse.

Razones para enviar un paquete (CRAN, Bioconductor, ...):

  • Contribución a la comunidad.
  • Facilidad de distribución.
JohnRos
fuente
77
Agregaría que la falta de experiencia también es una razón para escribir un paquete R. Escribir un paquete por primera vez no solo es divertido y un desafío, sino que realmente ayuda a formular ideas sobre cómo diseñar un paquete 'adecuado' que sea útil para uno mismo y para la comunidad. En otras palabras, incluso si uno carece de experiencia, sigue siendo una buena idea escribir un paquete para obtener experiencia al hacerlo.
Graeme Walsh
1
Su opinión, Grame, es bastante motivadora para un programador de R no tan experimentado que dudaría en diseñar un paquete. Por otro lado, aunque sin duda sería satisfactorio para uno mismo, noto que ambas respuestas enfatizan (y también puedo entender eso) la necesidad científica y de programación de un código limpio, eficiente y por encima de todo libre de errores. Entonces, eso abre una nueva pregunta que podría ser "¿Cómo asegurarse de que un paquete R esté libre de errores?", Supuestamente el trabajo de la comunidad, pero el creciente número de paquetes nuevos puede ser un límite para eso.
Jean-Baptiste Camps
Esto definitivamente vuelve a su punto de que hay una gran diferencia entre escribir un paquete (por ejemplo, para ganar experiencia) y realmente dar el siguiente paso y publicar el paquete. cbeleites nos dice que hace que sus paquetes sean "semipúblicos" y creo que su enfoque contiene elementos sobre cómo asegurarse de que un paquete R esté libre de errores (o mejor dicho, que la posibilidad de errores se minimice). Esencialmente, algún tipo de revisión por pares o fase de prueba es una forma de ayudar a garantizar que los paquetes R sean de buena calidad. Si surgen demasiados paquetes sin revisión, puede que no sean tan útiles.
Graeme Walsh
12

Recuerde que hay una opción # 3; puede pedirle al responsable de un paquete relevante que incluya su código o datos.


fuente
8

Mis disparadores personales para el empaque son:

  • Me parece que nuevamente estoy usando algún código que escribí una vez para otro proyecto de análisis de datos.
  • Creo que necesitaré el método que acabo de escribir nuevamente.
  • Un colega me pide el código. Una parte sustancial del código que escribo es al menos tanto a pedido de colegas (que usan R pero no programan tanto) como para mí.

  • Uso los requisitos formales de un paquete (documentación) para "obligarme" a limpiar y documentar mi código.

Estoy de acuerdo con @JohnRos en que hay una gran diferencia entre escribir un paquete y publicarlo.

  • Usualmente empaco temprano, pero luego hago el paquete solo "semipúblico". Es decir, puede estar disponible en un servidor interno (o en r-forge), para que mis colegas puedan acceder al paquete. Pero publico en CRAN solo después de que el paquete ha sido utilizado durante meses o incluso algunos años por colegas cercanos. Esto no muestra todos los errores de acuerdo con el punto n. ° 3 de @Nick Cox, pero una buena cantidad de ellos.
    Las versiones del paquete (pongo la fecha después del guión en el número de versión) hacen que sea fácil arreglar las cosas ("para hacer esto y aquello, asegúrese de instalar al menos la versión de la semana pasada")

  • Según mi contrato de trabajo, mi empleador tiene la última palabra sobre la decisión de si un paquete puede ser publicado en el mundo exterior y de qué manera.

Lo que aún no tengo una buena estrategia para empaquetar son los datos.


Comentarios a su lista de razones:

  • la inexistencia de otros paquetes en el mismo subcampo;

No encontrar un paquete que haga lo que necesito para mí provoca la escritura del código, pero no tiene que ver con la decisión de empaquetar o no.

  • la necesidad de intercambiar con otros investigadores y permitir la reproducibilidad de los experimentos;

Definitivamente Posiblemente ya sea la necesidad de compartir entre varias computadoras que uso.

Y entre los puntos que podrían conducir a una decisión contraria:

  • parte de los métodos utilizados ya presentes en algunos otros paquetes;

podría importar esos métodos en su paquete / código: este es un punto en contra de escribir dicho código, pero solo tiene que ver indirectamente con el empaquetado.

  • El número de nuevas funciones no es suficiente para justificar la creación de un nuevo paquete independiente.

Para mí, no hay un número mínimo de funciones para iniciar un paquete. En mi experiencia, los paquetes tienden a crecer "automáticamente". Por el contrario, después de encontrarme varias veces ramificando un nuevo paquete de otro (porque, por ejemplo, algunas funciones auxiliares al final resultaron ser temáticamente diferentes y útiles en otras situaciones también), ahora estoy bastante creando nuevos paquetes de inmediato.

Además, si no escribió documentación y pruebas, esto puede ser una cantidad prohibitiva de trabajo cuando se acumuló un número "suficiente" de funciones para crear un paquete.
(Si los escribe de inmediato, el esfuerzo adicional de incluirlo en un paquete es insignificante una vez que conoce el flujo de trabajo).

cbeleites apoya a Monica
fuente
3
+1. Otra buena forma de hacer que los paquetes sean semipúblicos es poner la fuente del paquete en GitHub: hace que el código sea más fácil de encontrar y alienta a otros a contribuir sin el pulido implícito de un paquete en CRAN.
Matt Parker
7

Yo diría que cree un paquete cada vez que esté haciendo un conjunto suficientemente grande de tareas similares en R que se beneficiaría de un paquete en el que puede colocar cosas en un espacio de nombres (para evitar conflictos con funciones con nombres similares), donde puede escribir documentación. Incluso tengo un paquete en github para agrupar una bolsa de funciones que no están relacionadas, pero las uso con tanta frecuencia que pensé que merecían documentación, archivos man, etc.

Otro caso de uso podría ser al enviar un documento, si tiene varias funciones, podría crear fácilmente un paquete, incluida la documentación para esas funciones, ejemplos para cada función y un tutorial sobre cómo usarlo. Y no necesita ponerlo en CRAN, como se dijo en las respuestas anteriores. Esto podría ser increíble para la reproducibilidad.

Tres herramientas que diría son importantes:

  • devtools pkg , para que sea muy fácil crear paquetes (también vea el wiki en las páginas de devtools github
  • paquete roxygen2 , para facilitar la escritura de documentación para su paquete
  • GitHub, puede usar install_github(o similar install_bitbucket, etc.) para instalar directamente desde GitHub, lo cual es bueno para compartir con otros.
sckott
fuente
5

Estoy de acuerdo con todo lo que leí hasta ahora. Todas esas razones son buenas prácticas de programación y no se aplican a R en particular. Sin embargo, me encuentro escribiendo paquetes R la mayor parte del tiempo, y por otra razón más. Entonces agregaré:

Razón específica de R para escribir un paquete R:

  • porque escribes en C

Cada vez que usa idiomas extranjeros como C, C ++ o FORTRAN (principalmente para computación de alto rendimiento), escribir un paquete vale la pena. Si tiene más de una o dos funciones, terminará rápidamente con archivos por todas partes y dependencias entre el código R y C que es difícil de mantener y portar.

gui11aume
fuente
0

Una razón no mencionada en las otras excelentes respuestas: tiene un proyecto de análisis de datos grande o complejo. Empaquetando, primero, los datos como un paquete, y luego extendiéndolos con funciones útiles para transformar, trazar o calcular análisis específicos. De esta forma, obtiene una versión documentada de los datos completa con todas las funciones utilizadas para calcular el análisis informado. Luego, los informes del proyecto pueden redactarse utilizando knitr u otros paquetes para una investigación reproducible.

Esto podría ahorrar significativamente tiempo si se debe realizar un nuevo análisis, o incluso podría publicarse (o semipublicarse) si se publican los análisis.

kjetil b halvorsen
fuente