如何解决更好地解释何时使用 Imports/Depends
"Imports"
比使用它的软件包更安全"Depends"
(并且相对于其他使用它的软件包,它也使使用它的软件包成为“更好的公民”"Depends"
)。
指令试图通过将"Depends"
另一个包附加到主搜索路径(即返回的环境列表)来确保来自另一个包的功能可用search()
。但是,如果稍后加载的另一个包在搜索路径上较早地放置了一个相同名称的函数,则此策略可能会受到阻碍。Chambers(在
SoDA
中)使用函数的示例,该函数在和包"gam"
中都可以找到。如果加载了另外两个包,其中一个依赖于,另一个依赖于,则调用找到的函数将取决于它们附加这两个包的顺序。不好。gam``mgcv``gam``mgcv``gam()
"Imports"
指令应该用于任何功能要放置在<imports:packageName>
(在
之后立即搜索)的支持包<namespace:packageName>
,而不是在常规搜索路径上。如果上面示例中的任何一个包都使用了该"Imports"
机制(文件中还需要import
或importFrom
指令NAMESPACE
),那么问题将通过两种方式得到改善。(1)
包本身将获得对mgcv
使用哪个功能的控制。(2) 通过保持主搜索路径不包含导入的对象,它甚至不会潜在地破坏其他包对其他mgcv
函数的依赖。
这就是为什么使用命名空间是一个很好的实践,为什么它现在被 CRAN 强制执行,以及(特别是)为什么 using"Imports"
比 using
更安全"Depends"
。
不幸的是,上面的建议有
常见的例外:如果你的包依赖于一个A
本身又依赖"Depends"
于另一个包的包B
,那么你的包可能需要附加A
一个"Depends
指令。
这是因为package 中 的情况下编写的。
指令将"Depends"
加载并附加 package A
,此时 packageA
自己的"Depends"
指令将在连锁反应中导致
packageB
也被加载和附加。然后包A
中的函数将能够找到B
它们所依赖的包中的函数。
"Imports"
指令将加载但不 附加 包A
, 既不 加载 也不
附加包B
。("Imports"
毕竟,期望包编写者使用命名空间机制,并且该包A
将使用"Imports"
指向B
它需要访问的任何函数。)
函数调用包A
中依赖于包中函数的任何函数B
将因此失败。
仅有的两个解决方案是:
-
A
使用"Depends"
指令让您的包裹附加包裹。 - 从长远来看,最好联系包的维护者
A
并要求他们更仔细地构建他们的命名空间
解决方法
“编写 R 扩展”手册提供了有关何时使用 Imports 或 Depends 的以下指导:
一般规则是
- 仅需要命名空间来使用 library(pkgname) 加载包的包必须列在“行业导入”字段中,而不是“附加”字段中。
- 需要附加以使用 library(pkgname) 成功加载包的包必须仅列在“epends”字段中。
有人可以对此提供更清晰的说明吗?我如何知道我的包何时只需要加载命名空间以及何时需要附加包?两者都有哪些例子?我认为典型的包只是函数的集合,这些函数有时会调用其他包中的函数(其中一些工作已经被编码)。这是上面的场景1还是2?
编辑
我写了一篇关于这个特定主题的博客文章(搜索“Imports v Depends”)。视觉效果使它更容易理解。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。