在为 R 制作自己的包时,通常希望使用来自不同包的函数。 也许它是一个绘图库,如ggplot2
、dplyr
,或者一些利基函数。
但是,当创建依赖于其他包中的函数的函数时,调用它们的适当方法是什么?特别是,我正在寻找何时使用的示例
myFunction <- function(x) {
example_package::function(x)
}
或
require(example_package)
myFunction <- function(x) {
function(x)
}
我什么时候应该使用一个而不是另一个?
如果实际创建 R 包(而不是源脚本、R 项目或其他方法),则切勿使用library()
或require()
。这不是使用package::function()
的替代方法。您实际上是在package::function()
和function()
之间进行选择,正如@Bernhard所强调的那样,显式调用包可确保在两个或多个包中存在冲突名称时保持一致性。
与其require(package)
,不如说是正确定义描述和命名空间文件。在SO和其他地方有很多关于此的帖子,因此不会详细介绍,例如请参阅此处。
如果您使用roxygen2
生成包文档,则使用package::function()
可以帮助解决上述问题(它将自动生成正确的 NAMESPACE 文件。
双冒号变体::
在极少数情况下具有明显的优势,当两个包使用相同的函数名称时。有一个函数psych::alpha
来计算克朗巴赫的alpha作为内部一致性的度量,还有一个函数scales::alpha
来修改颜色透明度。没有那么多例子,但话又说回来,有例子。dplyr
甚至屏蔽了stats
和base
包中的功能!(整洁的宇宙继续在我们的命名空间中产生越来越多的条目。如果您使用您不知道dyplr
,您今天使用的base
函数是否会被未来版本的dplyr
掩盖,从而导致将来您的包出现意外的运行时问题。
如果您使用::
变体,所有这些都没有问题。如果您的包裹中最后一个打开的包裹是您的意思,那么所有这些都不是问题。
require
(或library
)变体导致整体代码较短,很明显,在代码中的什么时间和地点,不可用包的问题将导致错误,从而变得可见。
一般来说,两者都工作得很好,你可以自由选择,这些公认的小差异中的哪一个对你来说似乎更重要。