gpt4 book ai didi

r - 如何在加载时使变量可用于命名空间

转载 作者:行者123 更新时间:2023-12-04 12:08:50 27 4
gpt4 key购买 nike

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

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

当我用 library(MyRpackage) 附加包裹时我可以使用 variable .

但是,无法执行 MyRPackage::variable 之类的操作。 (除非我已经用 library(MyRpackage) 附加了这个包。

我知道这是因为我应该将该代码放在 .onLoad 中。钩子(Hook),但是我无法进行分配以使其正常工作。

我试过了
.onLoad <- function(libname, pkgname) {
variable <- some_function()
assign("variable", variable, envir = as.environment("namesoace:MyRPackage"))
}


.onLoad <- function(libname, pkgname) {
variable <- some_function()
assign("variable", variable, envir = asNamespace("MyRPackage"))
}

但是当我运行 MyRPackage:::variable 时,它们都因一些错误而失败不使用 library附上包裹。

在 .onLoad Hook 中进行分配的正确方法是什么?

最佳答案

基本上有两种方式:

  • 通过 assignInMyNamespace(…)
  • 通过 assign(…, envir = topenv())

  • 虽然选项 1 似乎是 quite widespread ,它实际上需要更多代码,因为您首先需要创建一个变量,然后才能通过 assignInMyNamespace 覆盖它:
    myvar = NULL

    .onLoad = function (libname, pkgname) {
    assignInMyNamespace('myvar', value)
    }
    未能预先声明变量将导致错误。
    相比之下, assign完全有能力创建一个以前没有声明过的新变量。我们只需要告诉 R 分配变量到哪个环境,以及函数 topenv() 提供这个。
    .onLoad = function (libname, pkgname) {
    assign('myvar', value, envir = topenv())
    }

    关于r - 如何在加载时使变量可用于命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49056642/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com