【问题标题】:.onLoad to create a new environment in R.onLoad 在 R 中创建一个新环境
【发布时间】:2019-09-01 10:14:24
【问题描述】:

在我打算提交给 CRAN 的包中,我正在使用 .onload(...) 创建一个新环境,其中将存储所需的变量,而无需直接修改全局环境。

.onLoad <- function(...) {
  envr <- new.env() # when package is loaded, create new environment to store needed variables 
}

此函数保存在名为 zzz.R 的文件中。

然后我使用 assign(...) 将变量分配给新环境:

assign("x", x, envir = envr)

要在我创建的函数中检索新环境中的变量,我会这样做

envr$x

但是,在构建、安装、加载我的包和运行我的主函数时,我收到一个错误,即找不到对象“envr”。

我想知道这里发生了什么。

直接在 R 中创建一个新环境可以正常工作:

envr <- new.env()
envr$a <- 5
envr$a
[1] 5

有解决问题的想法吗?

【问题讨论】:

标签: r


【解决方案1】:

你的代码

envr <- new.env()

将新环境分配给.onLoad 函数中的局部变量。当该函数退出时,该变量在其他任何地方都不可见。

您可以使用&lt;&lt;- 在函数之外进行分配,但您必须小心。这使得 R 在封闭环境中查找,直到找到变量。如果它永远找不到它,它会在全局环境中完成分配,而这不是你要写的,所以 CRAN 不会接受你的包裹。

因此,正确的做法是按照https://stackoverflow.com/a/12605694/2372064 中的建议在任何函数外部创建变量,或者在函数外部创建变量但在加载时创建环境,例如

envr <- NULL
.onLoad <- function(...) {
  envr <<- new.env() # when package is loaded, create new environment to store needed variables 
}

【讨论】:

  • 谢谢。这有帮助。我的一个函数包含一个计时器(通过 proc.time()),它当前位于用户工作区(全局环境)中。我只希望在调用此函数时启动计时器。将 proc.time() 放入 .onLoad 是没有意义的。有没有一种简单的方法可以做到这一点?
  • 是的,使用local() 为它创建函数和一些持久存储。
猜你喜欢
  • 1970-01-01
  • 2018-04-26
  • 2017-05-21
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 2020-09-23
  • 2013-01-24
  • 1970-01-01
相关资源
最近更新 更多