.onLoad在R中创建新环境

时间:2019-04-10 21:01:44

标签: r

在我打算提交给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

是否有解决此问题的想法?

1 个答案:

答案 0 :(得分:1)

您的代码

envr <- new.env()

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

您可以使用<<-在函数外部进行分配,但必须小心。这使得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 
}