getNamespaceExports()从.onLoad包函数内调用
问题描述:
为什么getNamespaceExports()
在从外部代码调用时从.onLoad
上下文自动调用时会返回不同的结果?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)
}
包装上有一个空间文件看起来像这样:
# 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")
,我得到下面的输出(就像EXPE c):
> testpackage::call_when_onload("testpackage")
[1] "package_var" "call_when_onload"
[1] "package_var" "call_when_onload"
为什么?我怎样才能使.onLoad
函数评估上面的表达式就像他们在从外部上下文中调用时一样?
答
每?.onLoad
(重点煤矿):
加载后,loadNamespace查找名为.onLoad一个钩子函数和密封命名空间和加工出口前调用它(有两个未命名的参数)。
因此.onLoad
在从包中导出任何东西之前运行。
如果你想获得所有的出口对象,一个方法是从包读取空间文件,并对其进行处理:
f <- base::system.file("NAMESPACE", package="pkgname")
objs <- readLines(f)
exps <- objs[grepl("export", objs)]
sub("^export[^\\(]*\\(([^\\)]+)\\)", "\\1", exps)
一些调整,可能有必要的getNamespaceExports
输出完全匹配。
在将导出的对象写入全局环境之前,是否会执行'.onLoad'? – nilsole