首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >更好地解释何时使用导入/依赖

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

Stack Overflow用户
提问于 2011-12-27 01:58:25
回答 4查看 28.8K关注 0票数 165

"Writing R Extensions“手册提供了以下关于何时使用导入或依赖的指导:

一般规则是

使用库(Pkgname)加载包时只需要其命名空间的

  • 包必须列在“Imports”字段中,而不是列在“Depends”field.
  • Packages中。要使用库(Pkgname)成功加载包,需要附加这些包的包必须只列在“Depends”字段中。

有人能说得更清楚一点吗?我如何知道什么时候我的包只需要加载名称空间,什么时候我需要附加一个包?这两者的例子是什么?我认为典型的包只是一些函数的集合,这些函数有时会调用其他包中的函数(其中的一些工作已经编码完成)。这是上面的场景1还是场景2?

编辑

我写了一个关于这个特定主题的blog post (搜索'Imports v Depends')。视觉效果让它更容易理解。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-27 04:25:42

"Imports""Depends"更安全(与其他使用"Depends"的包相比,使用它的包也是更好的公民)。

"Depends"指令试图通过将另一个包附加到主搜索路径(即search()返回的环境列表)来确保另一个包中的函数可用。但是,如果稍后加载的另一个包将同名函数放在较早的搜索路径上,则此策略可能会受挫。Chambers (in SoDA)使用函数"gam"的示例,可以在gammgcv包中找到该函数。如果加载了另外两个包,其中一个依赖于gam,另一个依赖于mgcv,则通过调用gam()找到的函数将取决于附加这两个包的顺序。不太好。

任何支持包的函数都应该使用"Imports"指令(在<namespace:packageName>之后立即搜索),而不是在常规搜索路径上。如果上面示例中的任何一个包使用了"Imports"机制(该机制还需要NAMESPACE文件中的importimportFrom指令),问题将从两个方面得到改善。(1)包本身将获得对使用哪个mgcv函数的控制。(2)通过使主搜索路径远离导入的对象,甚至不会潜在地破坏其他包对其他mgcv函数的依赖。

这就是为什么使用名称空间是一种很好的实践,为什么它现在由CRAN强制执行,以及(特别是)为什么使用"Imports"比使用"Depends"更安全。

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

不幸的是,上面的建议有一个one常见的例外:如果你的包依赖于一个包A,而这个包本身"Depends"在另一个包B上,那么你的包可能需要使用"Depends指令附加A

这是因为在编写package A B 中的函数时,期望将package 及其函数附加到path。

"Depends"指令将加载并附加A包,此时A包自身的"Depends"指令将在连锁反应中导致B包也被加载和附加。A包中的函数将能够在B包中找到它们所依赖的函数。

"Imports"指令将加载但不附加包A,并且既不加载也不附加包B。(毕竟,"Imports"期望包编写器使用名称空间机制,并且包A将使用"Imports"指向B中它需要访问的任何函数。)因此,您的函数对依赖于B包中的函数的A包中的任何函数的调用都将失败。

唯一的两个解决方案是:

使用 directive.

  1. Better让您的软件包附加package A从长远来看,请联系package A的维护者,并要求他们更仔细地构建其命名空间(用Martin Morgan在this related answer).

中的话说

票数 156
EN

Stack Overflow用户

发布于 2015-08-12 18:23:44

Hadley Wickham给出了一个简单的解释(http://r-pkgs.had.co.nz/namespace.html):

Depends 或中列出软件包可确保在需要时进行安装。主要区别在于Imports仅加载软件包,而Depends会附加它。没有其他区别。..。

除非有其他好的理由,否则你应该总是在Imports Depends**. Depends**.中列出包,这是因为好的包是自包含的,并且最大限度地减少了对全局环境(包括搜索路径)的更改。唯一的例外是,如果您的软件包被设计为与另一个软件包一起使用。**例如,模拟软件包构建在素食的基础上。没有纯素食就没有用了,所以它在Depends而不是Imports中有纯素食。同样,ggplot2应该真正依赖于比例,而不是导入比例。

票数 31
EN

Stack Overflow用户

发布于 2011-12-27 02:53:33

SfDA中的钱伯斯说,当这个包使用“命名空间”机制时,应该使用“导入”,因为现在所有的包都需要使用它们,那么现在的答案可能是总是使用“导入”。在过去,包可以在没有实际名称空间的情况下加载,在这种情况下,您将需要使用Depends。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8637993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档