template data r devtools roxygen roxygen2

data - ¿Es posible usar los datos del paquete R en las pruebas o en los ejemplos de ejecución()?



roxygen template (2)

Estoy trabajando en el desarrollo de un paquete R, usando devtools, testthat y roxygen2. Tengo un par de conjuntos de datos en la carpeta de datos (foo.txt y bar.csv).

Mi estructura de archivos se ve así:

/ mypackage / data * foo.txt, bar.csv / inst / tests * run-all.R, test_1.R / man / R

Estoy bastante seguro de que ''foo'' y ''bar'' están documentados correctamente:

#'' Foo data #'' #'' Sample foo data #'' #'' @name foo #'' @docType data NULL #'' Bar data #'' #'' Sample bar data #'' #'' @name bar #'' @docType data NULL

Me gustaría usar los datos en ''foo'' y ''bar'' en mis ejemplos de documentación y pruebas unitarias.

Por ejemplo, me gustaría usar estos conjuntos de datos en mis pruebas que prueban llamando:

data(foo) data(bar) expect_that(foo$col[1], equals(bar$col[1]))

Y me gustaría que los ejemplos en la documentación se vean así:

#'' @examples #'' data(foo) #'' functionThatUsesFoo(foo)

Si trato de llamar a data (foo) al desarrollar el paquete, aparece el error "no se encontró el conjunto de datos ''foo''". Sin embargo, si compilo el paquete, lo instalo y lo cargo, entonces puedo hacer que las pruebas y los ejemplos funcionen.

Mis alternativas actuales son no ejecutar el ejemplo:

#'' @examples #'' /dontrun{data(foo)} #'' /dontrun{functionThatUsesFoo(foo)}

Y en las pruebas, cargue previamente los datos utilizando una ruta específica para mi computadora local:

foo <- read.delim(pathToFoo, sep="/t", fill = TRUE, comment.char="#") bar <- read.delim(pathToBar, sep=";", fill = TRUE, comment.char="#" expect_that(foo$col[1], equals(bar$col[1]))

Esto no parece ideal, especialmente porque estoy colaborando con otros, requiriendo que todos los colaboradores tengan los mismos caminos completos a ''foo'' y ''bar''. Además, los ejemplos en la documentación parecen no poder ejecutarse, aunque una vez que el paquete está instalado, pueden hacerlo.

¿Alguna sugerencia? Muchas gracias.


Importando archivos que no son RData dentro de ejemplos / pruebas

Encontré una solución a este problema mirando el paquete JSONIO , que obviamente necesitaba proporcionar algunos ejemplos de archivos de lectura distintos a los de la variedad .RData.

Conseguí que esto funcionara en los ejemplos de nivel de función y que R CMD check mypackage tanto el R CMD check mypackage como el testthat::test_package() .

(1) Reorganice la estructura de su paquete para que el directorio de datos de ejemplo esté dentro de la inst . En algún punto, el R CMD check mypackage me dijo que moviera archivos de datos no RData a inst/extdata , por lo que en esta nueva estructura, también se le cambia el nombre.

/ mypackage / inst / tests * run-all.R, test_1.R / extdata * foo.txt, bar.csv / man / R / tests * run-testthat-mypackage.R

(2) (Opcional) Agregue un directorio de tests nivel superior para que sus nuevas pruebas se ejecuten también durante el R CMD check mypackage .

El run-testthat-mypackage.R debe tener como mínimo las siguientes dos líneas:

library("testthat") test_package("mypackage")

Tenga en cuenta que esta es la parte que permite probar que se debe llamar durante el R CMD check mypackage , y de lo contrario no es necesario. Debe agregar testthat como una dependencia "Suggests:" también en su archivo DESCRIPTION.

(3) Finalmente, la salsa secreta para especificar su ruta dentro del paquete:

barfile <- system.file("extdata", "bar.csv", package="mypackage") bar <- read.csv(barfile) # remainder of example/test code here...

Si observa la salida del comando system.file() , está devolviendo la ruta completa del sistema a su paquete dentro del marco de R. En Mac OS X esto se ve algo así como:

"/Library/Frameworks/R.framework/Versions/2.15/Resources/library/mypackage/extdata/bar.csv"

La razón por la que me parece bien es que no codifica de forma rígida ninguna de las funciones de ruta distintas de las que se incluyen en su paquete, por lo que este enfoque debe ser sólido en relación con otras instalaciones R en otros sistemas.

enfoque de data()

En cuanto a la semántica de data() , por lo que puedo decir, esto es específico de los archivos binarios R ( .RData ) en el directorio de data nivel superior. Así que puedes sortear mi ejemplo anterior importando previamente los archivos de datos y guardándolos con el comando save() en tu directorio de datos. Sin embargo, esto supone que solo necesita mostrar un ejemplo en el que los datos ya están cargados en R, en lugar de demostrar de manera reproducible el proceso ascendente de importación de archivos.


El comentario de Per @ hadley, la conversión de .RData funcionará bien.

En cuanto a la cuestión más amplia de la colaboración en equipo con diferentes entornos a través de los miembros del equipo, un patrón común es acordar una sola variable de entorno, por ejemplo, FOO_PROJECT_ROOT , que todos en el equipo se configurarán de manera adecuada en su entorno. A partir de ese momento, puede utilizar rutas relativas, incluso a través de proyectos.

Un enfoque específico de R sería acordar algunos datos / funciones que cada miembro del equipo configurará en sus archivos .Rprofile . Así es, por ejemplo, cómo devtools encuentra paquetes en ubicaciones no estándar.

Por último, pero no menos importante, aunque no es óptimo, en realidad puede colocar código específico de desarrollador en su repositorio. Si @hadley lo hace, no es tan malo. Vea, por ejemplo, cómo activa ciertos comportamientos en testthat en su propio entorno.