如何附加包含非导出功能的包?

Dan*_*iel 3 debugging import r r-package

从外部包调试函数时,我经常发现自己将函数复制到新脚本中以添加我的更正,但我必须foo=extpack:::foo在脚本开头添加一堆函数才能访问包的内部函数。

在经常更改单行的情况下,克隆和构建包将是一种彻底的矫枉过正。

有没有办法附加包及其所有内部功能?

就像是 library(extpack, attach_nonexported=TRUE)

All*_*ron 8

您可以通过执行以下操作从包命名空间中获取所有函数作为环境:

getNamespace("ggplot2")
Run Code Online (Sandbox Code Playgroud)

因此,您可以library通过执行以下操作将它们附加到您的搜索路径(类似于使用未导出的函数调用):

attach(getNamespace("ggplot2"))
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢列表中的它们,则可以执行

as.list(getNamespace("ggplot2"))
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望它们出现在全局工作区中,您可以执行以下操作:

list2env(as.list(getNamespace("ggplot2")), globalenv())
Run Code Online (Sandbox Code Playgroud)

不用说,你应该只在交互式会话中做这种事情,而不是在编写包时。


use*_*330 1

修复此类错误的最佳方法是将修改后的函数的环境设置为与原始函数相同的环境。例如,要修复extpack::badfn使用

badfn <- function(...) { ... } # new version in your global workspace

environment(badfn) <- environment(extpack::badfn)
Run Code Online (Sandbox Code Playgroud)

这意味着它在调用时会看到私有函数,但不会extpack::badfn在原始位置替换,因此extpack调用它的其他函数仍会调用原始位置。如果您希望他们打电话给您,请使用

assignInNamespace("badfn", badfn, "extpack")
Run Code Online (Sandbox Code Playgroud)

进行上述更改后。

如果导入其他一些包extpack::badfn,它得到的内容将取决于确切的操作顺序,因此在这种情况下,您最好硬着头皮并在适当的修复后重建整个包。