[创建软件包时的环境问题

问题描述 投票:2回答:2

假设我有一个初始化新环境的功能:

init <-function()
{
    e <- new.env()
}

此外,init函数位于另一个.R文件中

然后,在初始化之后,我想开始在不同文件中的其他函数调用中使用它,例如

init.main <- function(e)
{
    e$data <- list()
    e$number <- 0
}

但是,这将引发错误,表明未找到对象e。我认为这是因为e仅在本地初始化,但是如果我要使用仅依赖于函数调用的程序包,我将如何使这些函数能够互相交谈并使用相同的环境?

r package
2个回答
1
投票

这里是一种方法。

init <- local({
  e <- NULL
  function() {
    e <<- new.env(parent = emptyenv())
  }
})
init.main <- function() {
  e <- get("e", envir = environment(init))
}

1
投票

这实际上取决于您是否只需要一个e还是希望能够拥有内容不同的多个环境。

在第一种情况下,只需在包的顶层定义e,然后让init函数修改该副本。例如,

e <- new.env()
init <- function() {
  e <<- new.env()
}

然后包中的其他任何功能都可以看到e并使用它。调用init()将清除以前的所有内容并将其设置为空。

另一种情况要难一些,只是因为您需要处理多个具有相同名称的函数,这些函数引用不同的e值。 R附带的R简介手册的10.7节中有一个示例。

© www.soinside.com 2019 - 2024. All rights reserved.