包中的全局变量 - 更推荐哪种方法?

Dea*_*ali 3 packages r

我确实理解通常全局变量是邪恶的,我应该避免它们,但如果我的包确实需要一个全局变量,这两种方法中的哪一种更好?还有其他推荐的方法吗?

  1. 使用包可见的环境

    pkgEnv <- new.env()  
    pkgEnv$sessionId <- "xyz123"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运用 options

    options("pkgEnv.sessionId" = "xyz123")
    
    Run Code Online (Sandbox Code Playgroud)

我知道有一些其他线程询问如何实现全局变量,但我还没有看到关于推荐哪一个的讨论

Ric*_*ven 7

有些软件包使用隐藏变量(即用开头的变量.),喜欢.Random.seed.Last.value做基础R.在你的包,你可以做

e <- new.env()
assign(".sessionId", "xyz123", envir = e)
ls(e)
# character(0)
ls(e, all = TRUE)
# [1] ".sessionId"
Run Code Online (Sandbox Code Playgroud)

但是在你的包中你不需要分配e.您可以使用.onLoad()钩子在加载包时分配变量.

.onLoad <- function(libname, pkgname) {
    assign(".sessionId", "xyz123", envir = parent.env(environment()))
}
Run Code Online (Sandbox Code Playgroud)

有关包变量的一些很好的解释,请参阅此问题及其答案.