问题描述
在为R制作自己的程序包时,通常希望利用其他程序包中的函数。
也许它是一个像ggplot2
,dplyr
之类的绘图库或一些小众功能。
但是,当创建一个依赖于其他包中的函数的函数时,调用它们的合适方法是什么?我特别在寻找何时使用的示例
myFunction <- function(x) {
example_package::function(x)
}
或
require(example_package)
myFunction <- function(x) {
function(x)
}
我什么时候应该使用另一个?
解决方法
如果您实际上是在创建R包(而不是用于源代码,R Project或其他方法的脚本),则应该从不使用library()
或{{1} }。这不是使用require()
的替代方法。您实际上是在package::function()
和package::function()
之间进行选择,正如@Bernhard所强调的那样,如果两个或多个软件包中的名称冲突,则显式调用该软件包可确保一致性。
您需要担心是否正确定义了Description和NAMESPACE文件,而不是function()
。关于SO以及其他地方有很多关于此的文章,因此不再赘述,例如,参见here。
如果您使用require(package)
来生成程序包文档,则使用package::function()
可以为您提供帮助(它会自动生成一个正确的NAMESPACE文件。
双冒号::
在少数情况下具有明显的优势,当两个软件包使用相同的函数名时。有一个函数psych::alpha
用于计算Cronbach的alpha值,以衡量内部一致性,还有一个函数scales::alpha
用于修改颜色透明度。例子不多,但又有例子。 dplyr
甚至掩盖了stats
和base
包中的功能! (tidyverse继续在我们的命名空间中生成越来越多的条目。如果您使用dyplr
,您将不知道,您今天使用的base
函数是否会被{{ 1}},从而在将来导致您的程序包出现意外的运行时间问题。)
如果使用dplyr
变体,那么所有这些都没有问题。如果在您的包裹中打开的最后一个包裹是您要的那个包裹,那么所有这些都不成问题。
::
(或require
)变体导致整体代码更短,很明显,在代码中的什么时间和位置,没有可用软件包的问题将导致错误,并且因此变得可见。
总的来说,两者都运作良好,您可以自由选择,其中哪些公认的细微差异对您来说似乎更为重要。