gpt4 book ai didi

r - 从 .onLoad 包函数中调用 getNamespaceExports()

转载 作者:行者123 更新时间:2023-12-04 17:02:12 24 4
gpt4 key购买 nike

为什么getNamespaceExports().onLoad 自动调用时返回不同的结果上下文而不是从外部代码调用时?

假设我们有一个名为 testpackage 的 R 包.这个包包含一个名为 hello.R 的 R 文件具有以下内容:

#' @export
package_var <- "some value"

#' @export
call_when_onload <- function(pkgname) {
print(getNamespaceExports(pkgname))
print(do.call("getNamespaceExports",list(pkgname),envir = globalenv()))
}

.onLoad <- function(libname, pkgname){
print(sprintf("Executing onload procedure for package %s...",pkgname))
call_when_onload(pkgname)
}

该包有一个 NAMESPACE 文件,如下所示:
# Generated by roxygen2: do not edit by hand

export(call_when_onload)
export(package_var)

现在问题来了:在记录和构建包之后, library("testpackage")返回这个:
> library(testpackage)
[1] "Executing onload procedure for package testpackage..."
character(0)
character(0)

但是当我调用 testpackage::call_when_onload("testpackage") ,我得到以下输出(正如预期的那样):
> testpackage::call_when_onload("testpackage")
[1] "package_var" "call_when_onload"
[1] "package_var" "call_when_onload"

为什么?我该如何制作 .onLoad函数评估上面的表达式就像它们在从外部上下文调用时评估一样?

最佳答案

?.onLoad (强调我的):

After loading, loadNamespace looks for a hook function named .onLoad and calls it (with two unnamed arguments) before sealing the namespace and processing exports.



所以 .onLoad在从包中导出任何内容之前运行。

如果要获取所有导出的对象,一种方法是从包中读取 NAMESPACE 文件并对其进行处理:
f <- base::system.file("NAMESPACE", package="pkgname")
objs <- readLines(f)
exps <- objs[grepl("export", objs)]
sub("^export[^\\(]*\\(([^\\)]+)\\)", "\\1", exps)

可能需要进行一些调整以匹配 getNamespaceExports 的输出确切地。

关于r - 从 .onLoad 包函数中调用 getNamespaceExports(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45983899/

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