更好地解释何时使用导入/依赖

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

一般规则是

  • 其名称空间仅用于使用库(Pkgname)加载包的包必须在“导入”字段中列出,而不是在“依赖”字段中列出。
  • 必须在“依赖”字段中列出使用库(Pkgname)成功加载包所需的包。

有人能在这个问题上提供更多的服务吗?我如何知道我的包何时只需要加载名称空间,何时需要附加包?这两者的例子是什么?我认为典型的包只是一个函数集合,有时会调用其他包中的函数(在这些包中,已经编写了一些代码)。这是上面的场景1还是2?

提问于
用户回答回答于

"Imports""Depends"(并使使用它的包相对于其他确实使用它的包成为“更好的公民”)"Depends").

"Depends"指令试图通过将另一个包附加到主搜索路径(即search())。但是,如果另一个包(稍后加载)将同名函数放在搜索路径的前面,则此策略可能会受到阻碍。使用函数的示例"gam",在两个gammgcv包裹。如果加载了另外两个包,其中一个依赖于gam一个依赖于mgcv,调用gam()将取决于他们所附的那两个包裹的顺序。

"Imports"指令将导入的包放置在<imports:packageName>(紧接其后搜查<namespace:packageName>),而不是在常规搜索路径上。如果上面示例中的任何一个包使用"Imports" mechanism, matters would be improved in two ways. (1) The package would itself gain control over which mgcv使用函数。(2)通过保持主搜索路径远离导入的对象,它甚至不会破坏另一个包对另一个包的依赖。mgcv功能。

这就是为什么使用名称空间是一种很好的实践,为什么现在由cran强制使用名称空间,以及(特别是)为什么使用"Imports"比使用"Depends"

编辑以添加一个重要的警告:

1不幸的是,上述建议的常见例外情况是:如果包依赖于包A它本身"Depends"在另一个包裹上B,包裹可能需要附加A带着"Depends指令。

这是因为包装功能A都是用预期的方式写成的B它的功能将附属于search()路径

"Depends"指令将加载和附加包。A,在哪一点上A自己的"Depends"指令会在连锁反应中导致包装B也要装上和附在一起。包装功能A将能够在包中找到函数。B他们所依赖的。

"Imports"指令将加载,但是附包A和意志两样负载也不附包B("Imports"毕竟,期望包编写器使用命名空间机制,而包则使用命名空间机制。A将使用"Imports"中的任何函数B(它需要访问。)。函数对包中任何函数的调用A它依赖于包中的功能B结果会失败

唯一的两种解决办法是:

  1. 让你的包裹附加包裹A使用"Depends"指令。
  2. 从长远来看,最好与软件包的维护人员联系。A并要求他们在构造他们的命名空间时做得更仔细
用户回答回答于

DependsImports确保在需要时安装。主要的区别是Imports把包裹装上,Depends把它接上。没有其他的区别。除非有很好的理由,否则,应该始终将包列在ImportsDepends这是因为一个好的包是自成一体的,并且尽量减少对全局环境的变化(包括搜索路径)。唯一的例外是,如果您的包被设计成与另一个包一起使用。例如,模拟包构建在纯素的基础上。没有纯素是没用的,所以它有纯素Depends而不是Imports。类似地,ggplot 2实际上应该依赖于比例,而不是导入它。

扫码关注云+社区