Загрузка объекта в глобальную среду в R Package с помощью.onLoad()

Я работаю над пакетом R, в котором мне нужно со временем управлять состоянием различных объектов. Концептуально, когда пакет загружается (.onLoad), он проверяет объект состояния в кэше и, если он не существует, создается новый экземпляр, сохраняется в кэше и назначается в глобальной среде. Я не смог увидеть объект в глобальной среде с помощью.onLoad() после создания сайта с помощью devtools:: build(). Итак, у меня есть три вопроса:

  1. Является ли функция.onLoad() подходящим местом для этой функции? Если да, то какова текущая лучшая практика для того, чтобы сделать переменные состояния видимыми в глобальной среде?
  2. Разработано ли решение (пакет) для управления состоянием через "сеансы R"?
  3. Есть ли лучший концептуальный подход к проблеме, чем тот, который я принял?

Решения пробовали... пока

Я изучил 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, что также сохраняет все открытые файлы, сохраняя нажатие клавиши. Это сочетание клавиш приводит к плавному процессу разработки:

  1. Отредактируйте файл R
  2. Нажмите Ctrl/Cmd + Shift + L.
  3. Изучите код в консоли.
  4. Промыть и повторить.

Поздравляем! Вы изучили свой первый рабочий процесс разработки пакета. Даже если вы ничего не узнаете из этой книги, вы получите полезный рабочий процесс для редактирования и перезагрузки кода R

Load_all(). Вот Это Да! Просто так просто. Load all запустил функцию.onload() и визуализировал объекты в глобальном окружении. Кто знал?

Ссылка: рабочий процесс кода R, пакеты R, Хэдли

Другие вопросы по тегам