Загрузка объекта в глобальную среду в R Package с помощью.onLoad()
Я работаю над пакетом R, в котором мне нужно со временем управлять состоянием различных объектов. Концептуально, когда пакет загружается (.onLoad), он проверяет объект состояния в кэше и, если он не существует, создается новый экземпляр, сохраняется в кэше и назначается в глобальной среде. Я не смог увидеть объект в глобальной среде с помощью.onLoad() после создания сайта с помощью devtools:: build(). Итак, у меня есть три вопроса:
- Является ли функция.onLoad() подходящим местом для этой функции? Если да, то какова текущая лучшая практика для того, чтобы сделать переменные состояния видимыми в глобальной среде?
- Разработано ли решение (пакет) для управления состоянием через "сеансы R"?
- Есть ли лучший концептуальный подход к проблеме, чем тот, который я принял?
Решения пробовали... пока
Я изучил SE, прочитал (и перечитал) книги Хэдли о R Packages и Advanced R, размышляя над виньетками Уинстона Чанга на R6 (ссылки внизу поста), и я провел эксперименты до трех неудачных подходов. Во-первых, вот простой "GameClass", который создает игру с тремя переменными, игроком 1, игроком 2 и состоянием (игры).
#' GameClass
#' \code{GameClass} Class that...#'
#' @export
GameClass <- R6::R6Class(
"GameClass",
public = list(
player1 = character(0),
player2 = character(0),
state = character(0),
initialize = function(player1, player2) {
self$player1 <- player1
self$player2 <- player2
self$state <- "1st Match"
}
)
)
Подход 1
Assign the variable to the global environment using the <<- operator
.onLoad <- function(libname, pkgname) {
gameFile <- "./gameFile.Rdata"
if (file.exists(gameFile)) {
game <<- load(gameFile)
} else {
game <<- GameClass$new("Eric", "Cassie")
save(game, file = gameFile)
}
}
Подход 2:
Создать новую среду и вернуть ее
.onLoad <- function(libname, pkgname) {
gameFile <- "./gameFile.Rdata"
e <- new.env()
if (file.exists(gameFile)) {
e$game <- load(gameFile)
} else {
e$game <- GameClass$new("Eric", "Cassie")
save(e$game, file = gameFile)
}
e
}
Подход 3:
.onLoad <- function(libname, pkgname) {
gameFile <- "./gameFile.Rdata"
if (file.exists(gameFile)) {
game <- load(gameFile)
} else {
game <- GameClass$new("Eric", "Cassie")
save(game, file = gameFile)
}
assign("game", game, envir = .GlobalEnv)
}
Информация о сессии
R version 3.4.1 (2017-06-30)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
Matrix products: default
locale:
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United
States.1252 LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C LC_TIME=English_United
States.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] R6Lab_0.1.0
loaded via a namespace (and not attached):
[1] compiler_3.4.1 R6_2.2.2 tools_3.4.1 yaml_2.1.14
Я новичок в ООП, новичок в R6, это мой первый пакет R, и я играю с R около года. Очевидно, я мог бы извлечь пользу из некоторого понимания здесь.
Заранее спасибо.
## References ##
[Hadley's Advanced R][1]
[Hadley's R Packages][2]
[Introduction to R6 Classes][3]
[How to define hidden global variables inside R Packages][4]
[Global variables in packages in r][5]
[Global variables in r][6]
[Global variable in a package which approach is more recommended][7]
[1]: http://adv-r.had.co.nz/
[2]: http://r-pkgs.had.co.nz/
[3]: https://cran.r-project.org/web/packages/R6/vignettes/Introduction.html
[4]: https://stackru.com/questions/34254716/how-to-define-hidden-global-variables-inside-r-packages
[5]: https://stackru.com/questions/12598242/global-variables-in-packages-in-r
[6]: https://stackru.com/questions/1236620/global-variables-in-r
[7]: https://stackru.com/questions/28246952/global-variable-in-a-package-which-approach-is-more-recommended
1 ответ
Должно быть слово для поиска сложных ответов среди очевидных решений. Это не могло быть более очевидным.
R код рабочего процесса
Первое практическое преимущество использования пакета заключается в том, что он легко перезагружает ваш код. Вы можете либо запустить devtools:: load_all (), либо в RStudio нажать Ctrl/Cmd + Shift + L, что также сохраняет все открытые файлы, сохраняя нажатие клавиши. Это сочетание клавиш приводит к плавному процессу разработки:
- Отредактируйте файл R
- Нажмите Ctrl/Cmd + Shift + L.
- Изучите код в консоли.
- Промыть и повторить.
Поздравляем! Вы изучили свой первый рабочий процесс разработки пакета. Даже если вы ничего не узнаете из этой книги, вы получите полезный рабочий процесс для редактирования и перезагрузки кода R
Load_all(). Вот Это Да! Просто так просто. Load all запустил функцию.onload() и визуализировал объекты в глобальном окружении. Кто знал?