R with roxygen2:如何使用另一个包中的单个函数?

R with roxygen2:如何使用另一个包中的单个函数?,r,roxygen2,R,Roxygen2,我正在创建一个R包,它将使用plyr中的单个函数。根据: 如果只使用另一个包中的几个函数,则 建议的选项是在Imports:字段中记录程序包名称 ,并使用显式调用函数:, e、 g.,pkg::fun() 听起来不错。我正在使用plyr::ldply()-对的完整调用:-因此我在导入:中列出plyr,在我的描述文件中。但是,当我使用devtools::check() * checking dependencies in R code ... NOTE All declared Imports s

我正在创建一个R包,它将使用
plyr
中的单个函数。根据:

如果只使用另一个包中的几个函数,则 建议的选项是在Imports:字段中记录程序包名称 ,并使用显式调用函数:, e、 g.,pkg::fun()

听起来不错。我正在使用
plyr::ldply()
-对
的完整调用:
-因此我在
导入:
中列出
plyr
,在我的
描述
文件中。但是,当我使用
devtools::check()

* checking dependencies in R code ... NOTE
All declared Imports should be used:
  ‘plyr’
  All declared Imports should be used.
为什么我会收到这张纸条

我可以通过在使用
plyr
的文件中添加
@importFrom dplyr ldply
来避免注释,但最后在包名称空间中添加了
ldply
。这是我不想要的,也不应该需要的,因为我在使用函数的时候使用了
plyr::ldply()

任何提示都将不胜感激

(可能相关。)

如果
ldply()
对包的功能很重要,那么您确实希望它位于包命名空间中。这就是名称空间导入的要点。您需要的函数应该在包名称空间中,因为这是R首先查找函数定义的地方,然后再遍历基本名称空间和附加的包。这意味着,无论加载或卸载、附加或未附加其他包,您的包始终可以访问该功能。在这种情况下,请使用:

@importFrom plyr ldply
您可以只引用
ldply()
,而不使用
plyr::
前缀,就像它是包中的另一个函数一样

如果
ldply()
不是很重要-可能在不常用的函数中只调用一次-则给出以下建议:

如果一个包只需要来自另一个包的几个对象,那么它可以在代码中使用完全限定的变量引用,而不是正式导入。对包
foo
中函数
f
的完全限定引用的格式为
foo::f
。这比正式导入的效率稍低,并且也失去了在
命名空间
文件中记录所有依赖项的优势(但它们仍然需要记录在
说明
文件中)。评估
foo::f
将导致加载包
foo
,但不会附加,如果尚未加载,这可能是延迟加载很少使用的包的优势

(我认为这个建议实际上有点过时,因为它意味着
DESCRIPTION
NAMESPACE
之间的分离比当前存在的要多。)它意味着您应该使用
@import plyr
并将函数称为
plyr::ldply()
。但实际上,它实际上是在建议将
plyr
放在
说明
建议
字段中,这不完全符合roxygen2标记,也不完全符合
R CMD检查

总之,官方的说法是Hadley的建议(您引用的)只适用于很少使用的包(和/或需要相当长时间加载的包)中很少使用的函数。否则,只需像WRE建议的那样执行
@importFrom

有选择地使用
importFrom
而不是
import
是一种很好的做法,尤其是当从包含十几个出口的软件包中导入时,推荐使用
importFrom


roxygen2
是否覆盖了您的
命名空间
文件?我相信你需要有
@import dplyr
来确保它是自动添加的。谢谢你的回答
roxygen2
确实正在更新我的
命名空间
文件。我不想使用
@import dplyr
,因为这会导入dplyr的整个名称空间。根据
roxygen2
vignette和我提到的另一个问题,我也不需要导入它。谢谢您的回答。当我对具有相同名称函数的两个包使用
@import-packagename
时,会出现问题
devtools::check()
然后给出如下内容:“发现以下重要警告:警告:加载“mypackage”时将以前的导入“IRanges::desc”替换为“plyr::desc”。当然,这可以通过使用
@importFrom
指定导入来避免。但是,如果您需要一个名为
foo
的函数(来自
packageA
)和名为
foo
的函数(来自
packageB
),那么这种情况又如何呢?同时导入这两个文件时,
check()
将发出投诉。对吗?@L42这就是使用
importFrom
的原因。在您提到的罕见情况下,会有R CMD检查投诉。一种解决方案可能是从
packageB
导入不同的函数(例如,
importFrom(packageB,bar)
,以确保安装了包并加载了其命名空间,然后参考
packageB::foo()
在您的代码中,不导入
foo
。另一个解决方案是创建一个新的单函数包,基本上用类似以下内容重命名重复的函数:
newname谢谢您的帮助。现在我觉得在
说明
文件中的
导入
中不可能列出一个包我的理解正确吗?如果正确,那么我认为
roxygen2
vignette和
Writing R Extensions
指南应该清楚地说明这一点。