base::library()
R パッケージ内で、R の関数にパッチを適用して、読み込まれたパッケージの検索パス内の位置を具体的に設定しようとしています。いくつかの環境 (すべて という名前) を定義env:<something>
しており、ライブラリが検索パスでこれらの環境の下に配置されていることを確認したいと考えています。
# wrap around library function.
library = function(..., pos = NULL) {
print("NEW LIBRARY FUNCTION!")
if (is.null(pos)) {
pos <- grep("env:", search())
pos <- if (length(pos) == 0) 2 else max(pos) + 1
}
base::library(..., pos=pos)
}
コンソールでこの関数を割り当てると、すべて正常に実行されます。
> library(stats)
[1] "NEW LIBRARY FUNCTION!"
> eval(parse(text = "library(stats)"))
[1] "NEW LIBRARY FUNCTION!"
> eval(parse(text = "library(stats)"), envir = globalenv())
[1] "NEW LIBRARY FUNCTION!"
パッケージ内で上記のラッパー関数を定義し、ビルドして新しい R セッションにロードすると、次のように実行されます。
> library(mypackage)
> mypackage:::library(stats)
[1] "NEW LIBRARY FUNCTION!"
しかし、の関数内で引数を使用eval()
すると、の新しい定義が取得されません。envir
mypackage
library()
# Functions defined in mypackage
testlibrary1 = function(...) {
library(...)
}
testlibrary2 = function(code) {
eval(parse(text = code))
}
testlibrary3 = function(code) {
eval(parse(text = code), envir = globalenv())
}
コンソールでは、次の結果が得られます。
> mypackage:::testlibrary1(stats)
[1] "NEW LIBRARY FUNCTION!"
> mypackage:::testlibrary2("library(stats)")
[1] "NEW LIBRARY FUNCTION!"
> mypackage:::testlibrary3("library(stats)")
>
最後の関数 はtestlibrary3()
、新しいラッパー関数を使用しませんでした。
library()
内部で呼び出すすべての関数がmypackage
ラッパー関数を使用するようにします。誰か助けてくれませんか?