我正在开发一个R包,我需要在其中管理各种对象的状态。从概念上讲,当包加载(.onLoad)时,它会检查缓存中的状态对象,如果它不存在,则创建一个新实例,保存到缓存,并在全局环境中分配。在使用devtools :: build()构建站点之后,我无法使用.onLoad()在全局环境中看到对象。所以,我有三个问题:
我已经搜过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"
}
)
)
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)
}
}
创建一个新环境并将其返回
.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
}
.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
答案 0 :(得分:1)
在明显的解决方案中,应该有一个词来寻找复杂的答案。它不可能更明显。
R代码工作流程
使用包的第一个实际优点是它很容易 重新加载您的代码。您可以运行 devtools :: load_all(),也可以运行 RStudio按Ctrl / Cmd + Shift + L,这也保存所有打开的文件, 为您节省一次击键。这个键盘快捷键导致流畅 开发工作流程:
- 编辑R档。
- 按Ctrl / Cmd + Shift + L。
- 浏览控制台中的代码。
- 冲洗并重复。
醇>恭喜!您已经学习了第一个包开发工作流程。即使你从中学到了什么 预订,您将获得编辑和重新加载R的有用工作流程 代码
load_all的数据类型()。哇!就这么简单。加载所有运行.onload()函数并将对象渲染到全局环境中。谁知道?