J'essaie d'utiliser le package data.table dans mon propre package. MWE est comme suit:
Je crée une fonction, test.fun, qui crée simplement un petit objet data.table, puis additionne le regroupement de colonnes "Val" par la colonne "A". Le code est
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)
}
Lorsque je crée cette fonction dans une session R normale, puis que j'exécute la fonction, cela fonctionne comme prévu.
> 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
Lorsque je mets cette fonction dans un package, installe le package, charge le package, puis exécute la fonction, j'obtiens un message d'erreur.
> 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
Quelqu'un peut-il m'expliquer pourquoi cela se produit et ce que je peux faire pour y remédier. Toute aide est fortement appréciée.
La supposition d'Andrie est juste, +1. Il y a un FAQ dessus (voir vignette("datatable-faq")
), ainsi qu'un nouveau vignette sur l'importation de data.table
:
FAQ 6.9: J'ai créé un package qui dépend de data.table. Comment puis-je m'assurer que mon package est compatible avec data.table afin que l'héritage de data.frame fonctionne?
Soit i) inclure
data.table
Dans le champDepends:
De votre fichier DESCRIPTION, soit ii) incluredata.table
Dans le champImports:
De votre fichier DESCRIPTION ETimport(data.table)
dans votre fichier NAMESPACE.
Plus d'informations ... en haut de [.data.table
(Et d'autres fonctions data.table
), Vous verrez un commutateur en fonction du résultat d'un appel à cedta()
. C'est l'abréviation de Calling Environment Data Table Aware. Taper data.table:::cedta
Révèle comment cela se fait. Il repose sur le paquet appelant ayant un espace de noms, et cet espace de noms Important ou Dépendant de data.table
. C'est ainsi que data.table
Peut être transmis à des packages non - compatibles avec data.table (comme les fonctions dans base
) et ces packages peuvent utiliser la syntaxe [.data.frame
absolument standard sur le data.table
, ignorant parfaitement que la data.frame
is()
a data.table
, aussi .
C'est aussi pourquoi l'héritage data.table
N'était pas compatible avec les packages sans nom, et pourquoi, à la demande de l'utilisateur, nous avons dû demander aux auteurs de ces packages d'ajouter un espace de noms à leur package pour être compatible. Heureusement, maintenant que R ajoute un espace de noms par défaut pour les packages manquant (à partir de la v2.14.0), ce problème a disparu:
MODIFICATIONS DE LA VERSION R 2.14.0
* Tous les packages doivent avoir un espace de noms, et un est créé lors de l'installation s'il n'est pas fourni dans les sources.
Voici la recette complète:
1) Ajoutez data.table
À Imports
dans votre fichier DESCRIPTION
.
2) Ajoutez @import data.table
À votre fichier .R respectif (c'est-à-dire le fichier .R qui héberge votre fonction qui génère l'erreur Error in [.data.frame(x, i, j) : object 'Val' not found
).
3) Tapez library(devtools)
et définissez votre répertoire de travail pour pointer vers le répertoire principal de votre package R.
4) Tapez document()
. Cela garantira que votre fichier NAMESPACE
comprend une ligne import(data.table)
.
5) Tapez build()
6) Tapez install()
Pour une introduction à Nice sur ce que font build()
et install()
, voir: http://kbroman.org/pkg_primer/ .
Ensuite, une fois que vous fermez votre session R et que vous vous connectez la prochaine fois, vous pouvez immédiatement vous lancer directement avec:
1) Tapez library("my_R_package")
2) Tapez le nom de votre fonction hébergée dans le fichier .R mentionné ci-dessus.
3) Profitez-en! Vous ne devriez plus recevoir la redoutée Error in [.data.frame(x, i, j) : object 'Val' not found