Как вы обрабатываете данные R внутри пакета? - PullRequest
30 голосов
/ 01 марта 2012

Разрабатываемый мной пакет R требует нескольких объектов данных R, таких как предварительно вычисленные модели и параметры.

В настоящее время каждый объект в каталоге 'data' пакета находится в отдельных файлах .RData.При использовании пакета пользователи могут использовать функцию «данные», чтобы прикрепить эти объекты к своей среде.

Вместо этого мне хотелось бы, чтобы при загрузке пакета объекты данных автоматически присоединялись к внутренней среде пакета и не были доступны непосредственно для пользователя.

Насколько я понимаю, размещение файла 'sysdata.rda' в каталоге 'R' пакета, содержащего объекты, находящиеся в данный момент в 'данных', даст мне желаемый результат.Тем не менее, есть ли способ сделать это так, чтобы я мог иметь каждый объект в отдельном файле, а не сгруппированы вместе?

Ответы [ 2 ]

14 голосов
/ 08 сентября 2012

Поместите файл sysdata.rda в каталог data вашего пакета.

Не используйте Lazy Data - в вашем файле DESCRIPTION не должно быть строки для LazyData или, если она есть,это должно быть LazyData: no

В любом файле .R в каталоге R вашего пакета добавьте строку, подобную этой

data(sysdata, envir=environment())

Я создал data.frame с именем sysdata и сохранилэто к файлу с именем sysdata.rda в каталоге данных пакета с именем anRpackage

Я добавил указанную выше строку в файл .R, а также добавил эту неэкспортированную функцию, просто чтобы показать, что функции в пакетеиметь доступ к данным.

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

Затем я вижу следующую сессию R

> 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

Итак, пользователи по-прежнему имеют доступ к данным, но, как вы и просили, они не имеютиметь прямой доступ.У пользователя все еще есть возможность запустить data(sysdata).

11 голосов
/ 03 мая 2013

Вы можете использовать ловушку .onLoad() для вызова data(), когда ваш пакет загружается, и указать пространство имен пакета в качестве среды, в которую следует загружать объекты данных.

Если у вас есть файлы model1.R и mydata.RData в каталоге data/ вашего пакета с именем foopkg, определите функцию

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

где-то в вашей посылке (например, в foopkg-package.R).

После сборки и установки пакета,

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

должен демонстрировать, что различные объекты данных были успешно загружены в пространство имен пакета, то есть видимы для функций в вашем пакете, но не загрязняют глобальную среду.

...