R 如何在加载时使变量对命名空间可用

R 如何在加载时使变量对命名空间可用,r,devtools,r-package,R,Devtools,R Package,在我的一个包中,我使用.onAttach钩子运行一些R代码,然后使用assign使值作为包变量之一可用。我这样做是因为variable取决于某个文件的内容,该文件可以在一个会话和另一个会话之间更改。我使用的代码如下所示: .onAttach <- function(libname, pkgname) { variable <- some_function() assign("variable", variable, envir = as.environment("pack

在我的一个包中,我使用
.onAttach
钩子运行一些R代码,然后使用
assign
使值作为包变量之一可用。我这样做是因为
variable
取决于某个文件的内容,该文件可以在一个会话和另一个会话之间更改。我使用的代码如下所示:

.onAttach <- function(libname, pkgname) {
   variable <- some_function()
   assign("variable", variable, envir = as.environment("package:MyRPackage"))
}

.onLoad按照相关问题中的方法,您可以更改
.onLoad()
函数,如下所示:

.onLoad <- function(libname, pkgname) {
    variable <- some_function()
    assign("variable", variable, envir = parent.env(environment()))
}
在一次新的R会议上,结果是

> MyRPackage:::variable
[1] 42
进一步解释 摘自哈德利·威克姆的:

有四种特殊环境:

  • environment()是当前环境

您可以使用ls()和 使用parent.env()查看其父级

因此,如果我们进一步修改
.onLoad()
函数,我们可以看到它的作用:

.onLoad <- function(libname, pkgname) {
    print(environment()) # For demonstration purposes only;
    print(parent.env(environment())) # Don't really do this.
    variable <- 42
    assign("variable", variable, envir = parent.env(environment()))
}

.onLoad基本上有两种方式:

  • 通过
    assignInMyNamespace(…)
  • 通过
    assign(…,envir=topenv())
  • 虽然选项1看起来是,但实际上它需要更多的代码,因为您首先需要创建一个变量,然后才能通过
    assignInMyNamespace
    覆盖它:

    myvar=NULL
    .onLoad=函数(libname,pkgname){
    assignInMyNamespace('myvar',值)
    }
    
    未能预先声明变量将导致错误

    相比之下,
    assign
    完全能够创建一个以前从未声明过的新变量。我们只需要告诉R将变量分配到哪个环境中,函数就提供了这一点

    .onLoad=function(libname,pkgname){
    赋值('myvar',value,envir=topenv())
    }
    
    你能解释一下为什么每次加载时都要重新计算变量吗?你能导出
    一些函数
    ,这样你就可以调用
    MyRPackage::some\u function()
    ?@Dason它必须从file@lucacerone那个文件是不是每次都会改变?是的Dason,它可以在一个会话和另一个会话之间更改感谢duckymar,让我做几个测试,我会让您知道它是否工作正常它是否工作正常谢谢:)您能否通过简要解释parent.env(environment())的内容稍微改进一下答案是真的吗?@lucacerone我今天晚些时候会编辑以添加更多内容detail@lucacerone增加了一些进一步的解释。
    .onLoad <- function(libname, pkgname) {
        variable <- 42
        assign("variable", variable, envir = parent.env(environment()))
    }
    
    > MyRPackage:::variable
    [1] 42
    
    .onLoad <- function(libname, pkgname) {
        print(environment()) # For demonstration purposes only;
        print(parent.env(environment())) # Don't really do this.
        variable <- 42
        assign("variable", variable, envir = parent.env(environment()))
    }
    
    <environment: 0x483da88>
    <environment: namespace:MyRPackage>