Question

Le package R que je développe nécessite plusieurs objets de données R, tels que des modèles et des paramètres pré-calculés.

Actuellement, j'ai chaque objet dans le répertoire «Data» du package dans des fichiers .rdata individuels. Lorsque vous utilisez les utilisateurs du package, les utilisateurs peuvent utiliser la fonction "Data" pour attacher ces objets à leur environnement.

Le comportement que je voudrais à la place serait que sur le chargement du package, les objets de données sont automatiquement attachés à l'environnement du package interne et non accessible à l'utilisateur directement.

Ma compréhension est que la mise en place d'un fichier «sysdata.rda» dans le répertoire «r» du package contenant les objets actuellement dans «données» me donnera le résultat souhaité. Cependant, existe-t-il un moyen de le faire afin que je puisse avoir chaque objet dans un fichier séparé au lieu de regrouper?

Était-ce utile?

La solution

Vous pouvez utiliser le .onLoad() crochet à appeler data() Lorsque votre package est chargé et spécifiez l'espace de noms de package comme l'environnement où charger les objets de données.

En supposant que vous avez des fichiers model1.R et mydata.RData dans le data/ Répertoire de votre package appelé foopkg, définir la fonction

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

quelque part dans votre package (par exemple foopkg-package.R).

Après avoir construit et installé le package,

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

Devrait démontrer que les différents objets de données ont été chargés avec succès dans l'espace de noms du package, c'est-à-dire visibles aux fonctions dans votre package mais ne polluant pas l'environnement global.

Autres conseils

Mettre votre sysdata.rda fichier dans le data Répertoire de votre colis.

N'utilisez pas de données paresseuses - votre fichier de description ne doit pas avoir de ligne pour LazyData, ou, si c'est le cas, il devrait être LazyData: no

Dans n'importe quel fichier .r dans le répertoire R de votre paquet, ajoutez une ligne comme celle-ci

data(sysdata, envir=environment())

J'ai créé un data.frame nommé sysdata et l'a enregistré dans un fichier appelésysdata.rda dans le répertoire de données d'un package appelé anRpackage

J'ai ajouté la ligne ci-dessus à un fichier .r, et j'ai également ajouté cette fonction non approuvée juste pour montrer que les fonctions dans le package ont accès aux données.

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

Ensuite, je vois la session suivante

> 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

Ainsi, les utilisateurs ont toujours accès aux données, mais comme vous l'avez demandé, ils n'ont pas direct accéder. L'utilisateur a toujours la possibilité d'exécuter data(sysdata).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top