Usando el paquete data.table dentro de mi propio paquete

Estoy tratando de usar el paquete data.table dentro de mi propio paquete. MWE es el siguiente:

Creo una función, test.fun, que simplemente crea un pequeño objeto data.table, y luego sum la agrupación de columnas “Val” por la columna “A”. El código es

test.fun<-function () { library(data.table) testdata<-data.table(A=rep(seq(1,5), 5), Val=rnorm(25)) setkey(testdata, A) res<-testdata[,{list(Ct=length(Val),Total=sum(Val),Avg=mean(Val))},"A"] return(res) } 

Cuando creo esta función en una sesión R regular, y luego ejecuto la función, funciona como se esperaba.

 > res res A Ct Total Avg [1,] 1 5 -0.5326444 -0.1065289 [2,] 2 5 -4.0832062 -0.8166412 [3,] 3 5 0.9458251 0.1891650 [4,] 4 5 2.0474791 0.4094958 [5,] 5 5 2.3609443 0.4721889 

Cuando coloco esta función en un paquete, instalo el paquete, cargo el paquete y luego ejecuto la función, obtengo un mensaje de error.

 > library(testpackage) > res<-test.fun() data.table 1.8.0 For help type: help("data.table") Error in `[.data.frame`(x, i, j) : object 'Val' not found 

¿Alguien puede explicarme por qué sucede esto y qué puedo hacer para solucionarlo? Cualquier ayuda es muy apreciada.

Andrie cree que es correcto, +1. Hay una pregunta frecuente sobre ella (ver vignette("datatable-faq") ), así como una nueva viñeta sobre la importación de data.table :

FAQ 6.9: He creado un paquete que depende de data.table. ¿Cómo me aseguro de que mi paquete sea compatible con data.table para que funcione la herencia de data.frame?

O bien, data.table en el campo Depends: de su archivo DESCRIPTION, o ii) data.table en el campo Imports: de su archivo DESCRIPTION E import(data.table) en su archivo NAMESPACE.

Más información … en la parte superior de [.data.table (y otras funciones data.table ), verás un interruptor dependiendo del resultado de una llamada a cedta() . Esto significa Calling Environment Data Table Aware. Escribir data.table:::cedta revela cómo se hace. Se basa en que el paquete de llamada tiene un espacio de nombres y ese espacio de nombres Importar o Depender en data.table de data.table . Así es como data.table se puede pasar a paquetes que no sean de data.table-aware (como funciones en la base ) y esos paquetes pueden usar una syntax [.data.frame absolutamente estándar en la data.table , felizmente ignorante de los data.frame is() un data.table , también.

Esta es también la razón por la data.table herencia de data.table no solía ser compatible con los paquetes de espacio de nombres, y por qué a petición del usuario tuvimos que pedirle a los autores de dichos paquetes que agreguen un espacio de nombres a su paquete para que sean compatibles. Afortunadamente, ahora que R agrega un espacio de nombres predeterminado para los paquetes que faltan (desde v2.14.0), ese problema se ha ido:

CAMBIOS EN LA VERSIÓN R 2.14.0
* Todos los paquetes deben tener un espacio de nombre, y uno se crea en la instalación si no se proporciona en las fonts.

Aquí está la receta completa:

1) Agregue data.table a Imports en su archivo DESCRIPTION .

2) Agregue @import data.table a su archivo @import data.table respectivo (es decir, el archivo .R que alberga su función que arroja el error Error in [.data.frame(x, i, j) : object 'Val' not found )

3) Escriba library(devtools) y configure su directorio de trabajo para que apunte al directorio principal de su paquete R.

4) Escriba el document() . Esto asegurará que su archivo NAMESPACE incluya una línea de import(data.table) .

5) Tipo de build()

6) Tipo de install()

Para obtener una buena introducción sobre lo que build() e install() hacen, consulte: http://kbroman.org/pkg_primer/ .

Luego, una vez que cierre su sesión R e inicie sesión la próxima vez, puede ingresar inmediatamente con:

1) Tipo de library("my_R_package")

2) Escriba el nombre de su función que se encuentra en el archivo .R mencionado anteriormente.

3) ¡Disfruta! Ya no deberías recibir el temido Error in [.data.frame(x, i, j) : object 'Val' not found