2012-03-01 33 views
27

El paquete R que estoy desarrollando requiere varios objetos de datos R, como modelos y parámetros precalculados.¿Cómo se manejan los datos R internos de un paquete?

Actualmente tengo cada objeto en el directorio 'datos' del paquete en archivos individuales .RData. Al utilizar el paquete, los usuarios pueden usar la función "datos" para adjuntar estos objetos a su entorno.

El comportamiento que me gustaría en cambio sería que al cargar el paquete, los objetos de datos se adjuntan automáticamente al entorno del paquete interno y no son accesibles para el usuario directamente.

Tengo entendido que colocar un archivo 'sysdata.rda' en el directorio 'R' del paquete que contiene los objetos actualmente en 'datos' me dará el resultado deseado. Sin embargo, ¿hay alguna forma de hacer esto para poder tener cada objeto en un archivo separado en lugar de agruparlos?

+0

¿Por qué poner cada objeto en un archivo separado, por qué no consultar cada objeto por separado? Por ejemplo, 'packagename ::: a' y' packagename ::: b'. –

+0

@the_skua Los archivos separados fueron útiles para facilitar la administración de la versión del archivo en el paquete. Esto fue hace un tiempo, pero creo que tenía ajustes de modelo diferentes como parte del paquete y, a veces, nos gustaría actualizar uno de estos, pero no todos. – Nixuz

Respuesta

9

Puede usar el gancho .onLoad() para llamar al data() cuando su paquete se está cargando, y especifique el espacio de nombres del paquete como el entorno donde cargar los objetos de datos.

Asumiendo que tiene archivos model1.R y mydata.RData en el directorio data/ de su paquete llamado foopkg, definir la función

.onLoad <- function(libname, pkgname) { 
    data("model1", "mydata", package=pkgname, envir=parent.env(environment())) 
} 

en alguna parte de su paquete (por ejemplo, en foopkg-package.R).

Después de construir e instalar el paquete,

> library(foopkg) 
> ls(loadNamespace("foopkg")) 

debe demostrar que los diversos objetos de datos se cargaron con éxito en el espacio de nombres de paquetes, es decir, visible para las funciones en el paquete, pero no contaminar el medio ambiente mundial.

12

Ponga su archivo sysdata.rda en el directorio data de su paquete.

No utilice Lazy datos - el archivo de descripción debe o bien no tiene una línea de LazyData, o, si lo hace, debe ser LazyData: no

En cualquier archivo .R en el directorio R de su paquete añadir una línea como esta

data(sysdata, envir=environment()) 

creé una data.framesysdata nombrado y se guarda en un archivo llamado sysdata.rda en el directorio de datos de un paquete llamado anRpackage

Agregué la línea anterior a un archivo .R, y también agregué esta función no exportada solo para mostrar que las funciones en el paquete tienen acceso a los datos.

foo <- function() tail(sysdata, 2) 

Entonces vea el siguiente de una sesión de R

> library(anRpackage) 
> sysdata 
Error: object 'sysdata' not found 

> anRpackage:::sysdata 
    A B C 
1 1 6 a 
2 2 7 b 
3 3 8 c 
4 4 9 d 
5 5 10 e 

> anRpackage:::foo() 
    A B C 
4 4 9 d 
5 5 10 e 

Por lo tanto, los usuarios tienen acceso a los datos, pero a medida que ha solicitado, que no tienen acceso directo . El usuario todavía tiene la opción de ejecutar data(sysdata).

+3

Esta respuesta no responde la pregunta. Estoy preguntando sobre la división de datos en diferentes archivos, no sobre el alcance de accesibilidad de datos. – Nixuz

+1

Dice que actualmente tiene muchos archivos de datos en el directorio de datos. Por lo tanto, agregue una línea como 'data (sysdata, envir = environment())' para cada uno de esos archivos de datos para que se "adjunten automáticamente al entorno del paquete interno y no sean accesibles para el usuario directamente". Por favor aclara lo que quieres – GSee

Cuestiones relacionadas