web-dev-qa-db-fra.com

Utilisation du package data.table dans mon propre package

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.

75
ruser

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 champ Depends: De votre fichier DESCRIPTION, soit ii) inclure data.table Dans le champ Imports: De votre fichier DESCRIPTION ET import(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.frameis() 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.

86
Matt Dowle

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

23
warship