r - 更好地解释何时使用 Imports/Depends

标签 r

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 文件中的 importFromNAMESPACE 指令),问题可以通过两种方式得到改善。 (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 中的函数结果就会失败。

唯一的两个解决方案是:

  1. 将您的包裹附加到包裹 A使用"Depends"指令。
  2. 从长远来看,最好联系软件包的维护者 A并要求他们更加仔细地构建命名空间(用 this related answer 中 Martin Morgan 的话说)。

关于r - 更好地解释何时使用 Imports/Depends,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8637993/

相关文章:

r - 通过另一列的成对组合计算一列的唯一值并按R中的第三列分组

r - 在 R 中,为每一行找到包含字符串的列

r - 初始参数估计时 nls 奇异梯度矩阵的误差

r - R 中的拆分和差异函数

r - 用不同的线型连接ggplot2中的点

r - 如何使用相关性而不是 R 中的欧几里德距离创建用于聚类的距离矩阵?

python - 将 Pandas df 转换为 rda 文件

r - 从 rlang 0.3.0 和 mutate_impl 起已失效

sql - 在 R 脚本中传递字符串变量以在 SQL 语句中使用它

r - 设置 ggplot 中纬度和经度轴标签的格式