在 R 包中,我正在尝试修补base::library()
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
都使用我的包装函数。有人可以帮帮我吗?