How do you handle R Data internal to a package?

只愿长相守 提交于 2019-12-02 17:06:44

You can use the .onLoad() hook to call data() when your package is being loaded, and specify the package namespace as the environment where to load the data objects into.

Assuming you have files model1.R and mydata.RData in the data/ directory of your package called foopkg, define the function

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

somewhere in your package (e.g. in foopkg-package.R).

After building and installing the package,

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

should demonstrate that the various data objects were successfully loaded into the package namespace, i.e. visible to functions in your package but not polluting the global environment.

Put your sysdata.rda file in the data directory of your package.

Do not use Lazy Data -- your DESCRIPTION file should either not have a line for LazyData, or, if it does, it should be LazyData: no

In any .R file in the R directory of your package add a line like this

data(sysdata, envir=environment())

I created a data.frame named sysdata and saved it to a file called sysdata.rda in the data directory of a package called anRpackage

I added the above line to an .R file, and also added this unexported function just to show that functions in the package have access to the data.

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

Then I see the following an R session

> 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

So, users still have access to the data, but as you requested, they do not have direct access. The user still has the option to run data(sysdata).

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!