1

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()すると、の新しい定義が取得されません。envirmypackagelibrary()

# 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ラッパー関数を使用するようにします。誰か助けてくれませんか?

4

1 に答える 1

1

問題は次のとおりだと思いますが、あなたの質問には完全に再現可能な例(つまり、パッケージをどこかにアップロードすることによる)が含まれていなかったため、わかりにくいです。

library関数が を介してパッケージからエクスポートされない限り、関数は表示されNAMESPACEません。したがって、libraryeval で使用できる唯一の関数はbase::library()です。

関数はパッケージの名前空間に存在しますが、呼び出し環境mypackage:::testlibraryX()は依然としてグローバル環境であることに注意してください。あなたのlibrary機能は利用できません。をエクスポートしてみて、これが役立つかどうかを確認してください。

于 2014-10-30T13:09:16.843 に答える