R with roxygen2:如何使用另一个包中的单个函数?
我正在创建一个R包,它将使用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
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
指南应该清楚地说明这一点。