“Writing R Extensions ”手册提供了有关何时使用 Imports 或 Depends 的以下指导:
The general rules are
- Packages whose namespace only is needed to load the package using library(pkgname) must be listed in the ‘Imports’ field and not in the ‘Depends’ field.
- Packages that need to be attached to successfully load the package using library(pkgname) must be listed in the ‘Depends’ field, only.
有人可以更清楚地说明这一点吗?我如何知道我的包何时只需要加载命名空间以及何时需要附加包?两者的例子是什么?我认为典型的包只是函数的集合,这些函数有时会调用其他包中的函数(其中一些工作已经被编码)。这是上面的场景 1 还是 2?
编辑
我写了一个blog post包含有关此特定主题的部分(搜索“Imports v Depends”)。视觉效果使其更容易理解。
最佳答案
"Imports"
比"Depends"
更安全(并且还使使用它的包相对于其他使用 "Depends"
的包成为“更好的公民”)。
一个"Depends"
指令尝试通过将另一个包附加到主搜索路径(即 search()
返回的环境列表)来确保另一个包中的函数可用。但是,如果稍后加载的另一个包将同名函数较早地放置在搜索路径上,则此策略可能会受到阻碍。 Chambers ( in SoDA ) 使用函数 "gam"
的示例,可在 gam
中找到和mgcv
包。如果加载了另外两个包,其中一个依赖于 gam
一个取决于 mgcv
,通过调用 gam()
找到的函数将取决于这两个包的附加顺序。不好。
安"Imports"
指令应用于任何其功能要放置在 <imports:packageName>
中的支持包。 (在 <namespace:packageName>
之后立即搜索),而不是在常规搜索路径上。如果上例中的任一包使用 "Imports"
机制(还需要 import
文件中的 importFrom
或 NAMESPACE
指令),问题可以通过两种方式得到改善。 (1) 程序包本身将获得对 mgcv
的控制权使用函数。 (2) 通过保持主搜索路径不包含导入的对象,它甚至不会潜在地破坏其他包对其他包的依赖 mgcv
功能。
这就是为什么使用命名空间是一个很好的实践,为什么它现在由 CRAN 强制执行,以及(特别是)为什么使用 "Imports"
比使用 "Depends"
更安全.
编辑添加重要警告:
不幸的是,上述建议有一个常见异常(exception):如果您的包依赖于包 A
其本身"Depends"
在另一个包裹上 B
,您的包裹可能需要附加 A
与 "Depends
指令。
这是因为包 A
中的函数编写时期望包 B
其功能将附加到 search()
路径。
一个"Depends"
指令将加载并附加包 A
,此时包A
自己的"Depends"
指令将产生链式 react ,导致包 B
也可以加载和连接。包中的功能A
然后就可以找到包 B
中的函数他们所依赖的。
安"Imports"
指令将加载但不附加包A
并且既不会加载也附加包B
。 (毕竟, "Imports"
期望包编写者使用命名空间机制,并且包 A
将使用 "Imports"
指向它需要访问的 B
中的任何函数。)包 A
中的任何函数依赖于包 B
中的函数结果就会失败。
唯一的两个解决方案是:
- 将您的包裹附加到包裹
A
使用"Depends"
指令。 - 从长远来看,最好联系软件包的维护者
A
并要求他们更加仔细地构建命名空间(用 this related answer 中 Martin Morgan 的话说)。
关于r - 更好地解释何时使用 Imports/Depends,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8637993/