在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