使用.onLoad()

时间:2017-07-25 04:55:45

标签: r oop environment-variables r-package r6

我正在开发一个R包,我需要在其中管理各种对象的状态。从概念上讲,当包加载(.onLoad)时,它会检查缓存中的状态对象,如果它不存在,则创建一个新实例,保存到缓存,并在全局环境中分配。在使用devtools :: build()构建站点之后,我无法使用.onLoad()在全局环境中看到对象。所以,我有三个问题:

  1. .onLoad()函数是否适用于此功能?如果是这样,目前在全球环境中使状态变量可见的最佳做法是什么?
  2. 是否已开发出用于管理“R会话”状态的解决方案(包)?
  3. 问题的概念方法是否比我采用的方法更好?
  4. 迄今为止,解决方案已尝试

    我已经搜过SE,阅读(并重新阅读)Hadley关于R Packages的书籍,以及Advanced R,在R6上对Winston Chang的小插曲(帖子底部的链接)进行了深思熟虑,我将我的实验提炼为三个失败的方法。首先,这是一个简单的“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   
    

    我是OOP的新手,是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://stackoverflow.com/questions/34254716/how-to-define-hidden-global-variables-inside-r-packages
      [5]: https://stackoverflow.com/questions/12598242/global-variables-in-packages-in-r
      [6]: https://stackoverflow.com/questions/1236620/global-variables-in-r
      [7]: https://stackoverflow.com/questions/28246952/global-variable-in-a-package-which-approach-is-more-recommended
    

1 个答案:

答案 0 :(得分:1)

在明显的解决方案中,应该有一个词来寻找复杂的答案。它不可能更明显。

  

R代码工作流程

     

使用包的第一个实际优点是它很容易   重新加载您的代码。您可以运行 devtools :: load_all(),也可以运行   RStudio按Ctrl / Cmd + Shift + L,这也保存所有打开的文件,   为您节省一次击键。这个键盘快捷键导致流畅   开发工作流程:

     
      
  1. 编辑R档。
  2.   
  3. 按Ctrl / Cmd + Shift + L。
  4.   
  5. 浏览控制台中的代码。
  6.   
  7. 冲洗并重复。
  8.         

    恭喜!您已经学习了第一个包开发工作流程。即使你从中学到了什么   预订,您将获得编辑和重新加载R的有用工作流程   代码

load_all的数据类型()。哇!就这么简单。加载所有运行.onload()函数并将对象渲染到全局环境中。谁知道?

参考:R Code Workflow, R Packages, Hadley