"Writing R Extensions“手册提供了以下关于何时使用导入或依赖的指导:
一般规则是
使用库(Pkgname)加载包时只需要其命名空间的
有人能说得更清楚一点吗?我如何知道什么时候我的包只需要加载名称空间,什么时候我需要附加一个包?这两者的例子是什么?我认为典型的包只是一些函数的集合,这些函数有时会调用其他包中的函数(其中的一些工作已经编码完成)。这是上面的场景1还是场景2?
编辑
我写了一个关于这个特定主题的blog post (搜索'Imports v Depends')。视觉效果让它更容易理解。
发布于 2011-12-27 04:25:42
"Imports"
比"Depends"
更安全(与其他使用"Depends"
的包相比,使用它的包也是更好的公民)。
"Depends"
指令试图通过将另一个包附加到主搜索路径(即search()
返回的环境列表)来确保另一个包中的函数可用。但是,如果稍后加载的另一个包将同名函数放在较早的搜索路径上,则此策略可能会受挫。Chambers (in SoDA)使用函数"gam"
的示例,可以在gam
和mgcv
包中找到该函数。如果加载了另外两个包,其中一个依赖于gam
,另一个依赖于mgcv
,则通过调用gam()
找到的函数将取决于附加这两个包的顺序。不太好。
任何支持包的函数都应该使用"Imports"
指令(在<namespace:packageName>
之后立即搜索),而不是在常规搜索路径上。如果上面示例中的任何一个包使用了"Imports"
机制(该机制还需要NAMESPACE
文件中的import
或importFrom
指令),问题将从两个方面得到改善。(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.
A
从长远来看,请联系package A
的维护者,并要求他们更仔细地构建其命名空间(用Martin Morgan在this related answer).中的话说
发布于 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应该真正依赖于比例,而不是导入比例。
发布于 2011-12-27 02:53:33
SfDA中的钱伯斯说,当这个包使用“命名空间”机制时,应该使用“导入”,因为现在所有的包都需要使用它们,那么现在的答案可能是总是使用“导入”。在过去,包可以在没有实际名称空间的情况下加载,在这种情况下,您将需要使用Depends。
https://stackoverflow.com/questions/8637993
复制相似问题