Как вы обрабатываете R Data внутри пакета?
Для R-пакета, который я разрабатываю, требуется несколько объектов данных R, таких как предварительно вычисленные модели и параметры.
В настоящее время у меня есть каждый объект в каталоге данных в пакете в отдельных файлах .RData. При использовании пакета пользователи могут использовать функцию "данных" для присоединения этих объектов к своей среде.
Поведение, которое я хотел бы вместо этого, было бы в том, что при загрузке пакета объекты данных автоматически присоединяются к внутренней среде пакета и не доступны пользователю напрямую.
Я понимаю, что размещение файла sysdata.rda в каталоге "R" пакета, содержащего объекты, находящиеся в "данных", даст мне желаемый результат. Однако есть ли способ сделать это, чтобы я мог иметь каждый объект в отдельном файле, а не сгруппирован вместе?
Ответы
Ответ 1
Вы можете использовать hook .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"))
должен продемонстрировать, что различные объекты данных были успешно загружены в пространство имен пакетов, то есть видны для функций в вашем пакете, но не загрязняют глобальную среду.
Ответ 2
Поместите свой 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)
.