2014-10-30 88 views
1

在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()的函数都可以使用我的包装函数。有人可以帮我吗?

回答

1

我猜这个问题是下面的问题,但由于你的问题没有包括一个完全可重现的例子(即通过在某个地方上传软件包)很难说清楚。

只要您的library函数未通过NAMESPACE从包中导出,就不可见。因此,唯一可用的library函数来评估是base::library()

请注意,尽管您的函数驻留在包的名称空间中,但mypackage:::testlibraryX()的调用环境仍是全局环境。您的library功能不可用。尝试导出,看看这是否有帮助。

+0

简单地输出功能做了诀窍,谢谢! – filipsch 2014-10-31 09:17:46