使用其他包中的函数-何时使用package :: function?

问题描述

在为R制作自己的程序包时,通常希望利用其他程序包中的函数。 也许它是一个ggplot2dplyr之类的绘图库或一些小众功能

但是,当创建一个依赖于其他包中的函数函数时,调用它们的合适方法是什么?我特别在寻找何时使用的示例

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甚至掩盖了statsbase包中的功能! (tidyverse继续在我们的命名空间中生成越来越多的条目。如果您使用dyplr,您将不知道,您今天使用的base函数是否会被{{ 1}},从而在将来导致您的程序包出现意外的运行时间问题。)

如果使用dplyr变体,那么所有这些都没有问题。如果在您的包裹中打开的最后一个包裹是您要的那个包裹,那么所有这些都不成问题。

::(或require)变体导致整体代码更短,很明显,在代码中的什么时间和位置,没有可用软件包的问题将导致错误,并且因此变得可见。

总的来说,两者都运作良好,您可以自由选择,其中哪些公认的细微差异对您来说似乎更为重要。