tutorial - r studio create data table
Usando el paquete data.table dentro de mi propio paquete (2)
Andrie cree que es correcto, +1. Hay una pregunta frecuente sobre ella (ver vignette("datatable-faq")
), así como una nueva vignette 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 campoDepends:
de su archivo DESCRIPTION, o ii)data.table
en el campoImports:
de su archivo DESCRIPTION Eimport(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 sintaxis [.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 fuentes.
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 suma 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<-test.fun()
data.table 1.8.0 For help type: help("data.table")
> 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.
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