1

在 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()时,不会检索到我的新定义: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它是不可见的。因此, eval 唯一可用library的函数是base::library().

请注意,虽然您的函数位于包的命名空间中,但其调用环境mypackage:::testlibraryX()仍然是全局环境。那里您的library功能不可用。尝试导出是,看看这是否有帮助。

于 2014-10-30T13:09:16.843 回答