我正在创建一个将使用的 R 包单一功能 from plyr
。根据这个 roxygen2 小插图 https://cran.r-project.org/web/packages/roxygen2/vignettes/namespace.html:
如果您只使用另一个包中的几个函数,
推荐的选项是在 Imports: 字段中记下包名称
描述文件并使用 ::, 显式调用函数
例如,pkg::fun()。
听起来很好。我在用着plyr::ldply()
- 完整的通话::
-所以我列出plyr
in Imports:
in my DESCRIPTION
文件。但是,当我使用devtools::check()
我明白了:
* checking dependencies in R code ... NOTE
All declared Imports should be used:
‘plyr’
All declared Imports should be used.
为什么我会收到此注释?
我可以通过添加来避免注释@importFrom dplyr ldply
在正在使用的文件中plyr
,但后来我结束了ldply
在我的包命名空间中。我不想要,也不应该需要,因为我正在使用plyr::ldply()
我单次使用该功能。
任何指示将不胜感激!
(这个问题 https://stackoverflow.com/questions/28335991/package-imports-error-on-devtoolscheck可能相关。)
If ldply()
对于你的包的功能很重要,那么您确实希望它位于您的包命名空间中。这就是命名空间导入的要点。您需要的函数应该位于包命名空间中,因为这是 R 首先查找函数定义的位置,然后再遍历基本命名空间和附加的包。这意味着无论加载或卸载什么其他包、附加或未附加任何其他包,您的包都将始终可以访问该功能。在这种情况下,请使用:
@importFrom plyr ldply
你可以参考一下ldply()
没有plyr::
前缀就像它是包中的另一个函数一样。
If ldply()
并不那么重要- 也许在不常用的函数中只调用一次 - 那么,编写 R 扩展 1.5.1 https://cran.r-project.org/doc/manuals/r-devel/R-exts.html#Specifying-imports-and-exports给出以下建议:
如果一个包只需要另一个包中的几个对象,它可以在代码中使用完全限定的变量引用,而不是正式导入。对函数的完全限定引用f
包装内foo
是这样的形式foo::f
。这比正式导入的效率稍低,并且也失去了在中记录所有依赖项的优势。NAMESPACE
文件(但仍需要将它们记录在DESCRIPTION
文件)。评估foo::f
会造成包foo
加载,但不附加(如果尚未加载)——这可能是延迟加载很少使用的包的一个优点。
(我认为这个建议实际上有点过时了,因为它意味着两者之间有更多的分离DESCRIPTION
and NAMESPACE
比目前存在的。)这意味着你应该使用@import plyr
并将该函数称为plyr::ldply()
。但实际上,它实际上是在建议类似放置plyr
in the Suggests
现场DESCRIPTION
,这并不完全符合 roxygen2 标记,也不完全符合R CMD check
.
In sum,官方说法是,Hadley 的建议(您引用的)仅适用于很少使用的包(和/或需要大量时间加载的包)中的很少使用的功能。否则,就这样做@importFrom
like WRE建议:
Using importFrom
有选择地而不是import
这是一种很好的做法,在从具有十多个导出的包中导入时尤其值得推荐。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)