2017-08-31 91 views
0

为什么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函数评估上面的表达式就像他们在从外部上下文中调用时一样?

+0

在将导出的对象写入全局环境之前,是否会执行'.onLoad'? – nilsole

回答

1

?.onLoad(重点煤矿):

加载后,loadNamespace查找名为.onLoad一个钩子函数和密封命名空间和加工出口前调用它(有两个未命名的参数)

因此.onLoad在从包中导出任何东西之前运行。

如果你想获得所有的出口对象,一个方法是从包读取空间文件,并对其进行处理:

f <- base::system.file("NAMESPACE", package="pkgname") 
objs <- readLines(f) 
exps <- objs[grepl("export", objs)] 
sub("^export[^\\(]*\\(([^\\)]+)\\)", "\\1", exps) 

一些调整,可能有必要的getNamespaceExports输出完全匹配。