2017-08-31 20 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として次のような出力が(取得cted):

> testpackage::call_when_onload("testpackage") 
[1] "package_var"  "call_when_onload" 
[1] "package_var"  "call_when_onload" 

なぜですか? .onLoad関数は、外部コンテキストから呼び出されたときに評価されたように、上記の式を評価するにはどうすればよいですか??.onLoad(強調鉱山)パー

+0

エクスポートされたオブジェクトがグローバル環境に書き込まれる前に '.onLoad'が実行されることはありますか? – nilsole

答えて

1

ロードした後、loadNamespaceは.onLoadという名前のフック関数を探し、(2つの無名の引数を指定して)それを呼び出し名前空間と加工輸出を封止前。

したがって、.onLoadが実行されてからパッケージからエクスポートされます。

あなたはすべてのエクスポートされたオブジェクトを取得したい場合は、一つの方法は、パッケージから名前空間ファイルを読み込み、それを処理することです:

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

いくつかの調整が正確にgetNamespaceExportsの出力と一致する必要があるかもしれません。

関連する問題