Подтвердить что ты не робот

Как вы обрабатываете R Data внутри пакета?

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

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

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

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

4b9b3361

Ответ 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).