Mi grupo ha estado desarrollando un paquete R para simular el crecimiento de las plantas (ver el repositorio de GitHub ). El paquete R se usa .Call
para interactuar con C.
Hemos decidido que valdría la pena crear una biblioteca C independiente. Las dos razones clave son 1) usar herramientas de depuración de C familiares y 2) una gran parte de la comunidad de desarrolladores / usuarios está familiarizada con lenguajes compilados (la mayoría de los modelos de la clase están escritos en C o Fortran). Sin embargo, el paquete R es accesible para muchos fuera de esta comunidad, por lo que queremos mantener su funcionalidad.
He revisado algunas preguntas relacionadas, por ejemplo, https://stackoverflow.com/q/12328156/199217 , que discuten los paquetes R con las dependencias de la biblioteca C, pero no he encontrado una que se ocupe específicamente de desacoplar un paquete R existente.
Un enfoque propuesto
(lo que se nos ocurrió hasta ahora ... un hombre de paja)
- Escribir pruebas para la funcionalidad existente
- mantener la biblioteca C dentro de la
src/
carpeta - Coloque el código C específico de R (p
SEXP
. Ej. , Cargando bibliotecas R, etc.) en archivos 'R wrapper' antepuestos conR_*
- crear funciones separadas para leer archivos de configuración en C
- crear una función 'principal' C para reemplazar la funcionalidad en R
- escribir un archivo MAKE para la biblioteca C que ignora los archivos de contenedor R
- Una vez que la biblioteca C funciona de manera independiente y equivalente al paquete R, podríamos considerar mover las funciones C a un repositorio separado, eso sería una dependencia para el paquete R
Preguntas:
- ¿Es este esfuerzo equivocado?
- ¿Estamos pasando por alto posibles peligros?
- ¿Hay una mejor manera de desarrollar las bibliotecas R y C en paralelo?
- ¿Hay algún ejemplo de bibliotecas C que se hayan desacoplado de paquetes R?
- ¿Cómo podríamos escribir pruebas para comparar funciones equivalentes en R y C?
Respuestas:
En términos generales, esta es una buena idea y muchos paquetes lo hacen. Puede buscar
RSQLite
inspiración: se empaquetansqlite
y solo incluyen algunas funciones de contenedor. Similar pararhdf5
yhdf5
En cuanto a sus puntos:
Siempre es una buena idea!
Sí, o podría considerar
inst/include
si alguna vez tomó la ruta de 'solo encabezado', a laRcpp
Parece lo suficientemente sensible.
No estoy exactamente seguro de lo que quieres decir aquí.
Esto me parece extraño. ¿Por qué necesita un
main
- no solo está desarrollando una biblioteca de funciones invocables? Deja que R sea tumain
:)Sí, probablemente necesitará una mayor participación
Makefile
para manejar esto; nuevamente sugiero que busque el código fuente de RSQLite, y también los R-exts pueden ser útiles.Sí, esto parece razonable: haga que el paquete R recupere el código fuente C según sea necesario al compilar / desarrollar el paquete. De esta manera se pueden desacoplar efectivamente.
fuente