R: Как запустить код при загрузке пакета?

Я учусь собирать пакет для R. Теперь, чтобы настроить его, мне нужно запустить некоторый код, когда пакет загружается через require(myPackage).

Я прочитал документацию по help(".onLoad"), которая меня очень смутила, так как нет примера. Как мне на самом деле использовать .onLoad?

Может кто-нибудь показать мне простой пример? Например, я знаю, что export(myfun) в файле NAMESPACE будет экспортировать myfun для использования, какой код мне нужно запустить, скажем, rnorm(10) при загрузке пакета?


person xiaodai    schedule 26.11.2013    source источник


Ответы (1)


Обычно существует «функция обработки» (традиционно называемая zzz.R) с задачами, которые должны выполняться при загрузке пакета, такими как загрузка библиотек и скомпилированного кода. Например, вы можете создать файл zzz.R, в котором вы создаете эту функцию:

.onLoad <- function(libname, pkgname){
  x <- rnorm(10)   ## dummy example 
}
person agstudy    schedule 26.11.2013
comment
Например, пакет dplyr использует функцию .onLoad, видимую в zzz.r. файл. - person Paul Rougieux; 27.08.2018
comment
Этот функционал убрали? Это не сработало бы для меня, но assign('x', rnorm(1), envir = .GlobalEnv) сработало - person drj3122; 25.01.2021
comment
@ drj3122 Нет, ответ просто неверный; этот код никогда не работал. Но твой код тоже не правильный, не пиши данные в глобальную среду. Вы хотите записать данные в среду package. Для этого вам нужно использовать topenv() вместо .GlobalEnv. См. stackoverflow.com/a/67664852/1968. - person Konrad Rudolph; 24.05.2021
comment
@KonradRudolph Что вы подразумеваете под неправильным ответом? - person agstudy; 25.05.2021
comment
@agstudy Я имею в виду, что это не работает: <- выполняет локальное присваивание, которое здесь бесполезно (я понимаю, что это игрушечный пример, но один из лучших вариантов использования .onLoad — это установить переменную пакета). Кстати, использование <<- этого не исправит. Смотрите связанный ответ для правильного исправления. - person Konrad Rudolph; 25.05.2021