在R包中,我試圖修補R中的base::library()
函數,以專門設置搜索路徑中加載包的位置。我已經定義了幾種環境(全部命名爲env:<something>
),並且希望確保將這些庫放置在搜索路徑的這些環境下。Patch base ::使用R中的包裝庫
# 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
,我的新DEFI時的library()
nition沒有檢索:
# 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()
,並沒有使用新的包裝函數。
我想要mypackage
中的所有調用library()
的函數都可以使用我的包裝函數。有人可以幫我嗎?
簡單地輸出功能做了訣竅,謝謝! – filipsch 2014-10-31 09:17:46