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

Using functions from other packages - when to use package::function?

在为 R 创建自己的程序包时,人们通常希望使用来自不同程序包的函数。 也许它是像 ggplot2dplyr 这样的绘图库,或者一些小众函数。

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

的示例
myFunction <- function(x) {
example_package::function(x)
}

require(example_package)

myFunction <- function(x) {
function(x)
}

我什么时候应该使用一个而不是另一个?

douple-colon 变体 :: 在极少数情况下具有明显的优势,当两个包使用相同的函数名称时。有一个函数 psych::alpha 用于计算 Cronbach 的 alpha 作为内部一致性的度量,还有一个函数 scales::alpha 用于修改颜色透明度。没有那么多例子,但话又说回来,有例子。 dplyr 甚至屏蔽了 statsbase 包中的函数! (而且 tidyverse 继续在我们的命名空间中产生越来越多的条目。如果你使用 dyplr 你不知道,如果你今天使用的 base 功能将被未来版本的 dplyr 从而导致你的包在未来出现意外的运行时问题。)

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

require(或library)变体导致整体代码更短,很明显,not-available包的问题将导致代码中的什么时间和位置错误并因此变得可见。

总的来说,两者都很好用,您可以自由选择,这些公认的小差异中哪一个对您来说更重要。

如果您实际上是在创建 R 包(而不是源脚本、R 项目或其他方法),您应该永远 使用library()require()。这不是使用 package::function() 的替代方法。您实际上是在 package::function()function() 之间进行选择,正如 @Bernhard 所强调的那样,如果两个或多个包中存在名称冲突,显式调用包可确保一致性。

而不是 require(package),您需要担心正确定义 DESCRIPTION 和 NAMESPACE 文件。在 SO 和其他地方有很多关于这个的帖子,所以不会详细介绍,例如参见 [​​=18=]。

如果您使用 roxygen2 生成您的包文档,则使用 package::function() 可以帮助完成上述操作(它将自动生成一个正确的 NAMESPACE 文件。