使用其他包中的函数 - 何时使用 package::function?
Using functions from other packages - when to use package::function?
在为 R 创建自己的程序包时,人们通常希望使用来自不同程序包的函数。
也许它是像 ggplot2
、dplyr
这样的绘图库,或者一些小众函数。
但是,当创建依赖于其他包中函数的函数时,调用它们的正确方法是什么?特别是,我正在寻找何时使用
的示例
myFunction <- function(x) {
example_package::function(x)
}
或
require(example_package)
myFunction <- function(x) {
function(x)
}
我什么时候应该使用一个而不是另一个?
douple-colon 变体 ::
在极少数情况下具有明显的优势,当两个包使用相同的函数名称时。有一个函数 psych::alpha
用于计算 Cronbach 的 alpha 作为内部一致性的度量,还有一个函数 scales::alpha
用于修改颜色透明度。没有那么多例子,但话又说回来,有例子。 dplyr
甚至屏蔽了 stats
和 base
包中的函数! (而且 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 文件。
在为 R 创建自己的程序包时,人们通常希望使用来自不同程序包的函数。
也许它是像 ggplot2
、dplyr
这样的绘图库,或者一些小众函数。
但是,当创建依赖于其他包中函数的函数时,调用它们的正确方法是什么?特别是,我正在寻找何时使用
的示例myFunction <- function(x) {
example_package::function(x)
}
或
require(example_package)
myFunction <- function(x) {
function(x)
}
我什么时候应该使用一个而不是另一个?
douple-colon 变体 ::
在极少数情况下具有明显的优势,当两个包使用相同的函数名称时。有一个函数 psych::alpha
用于计算 Cronbach 的 alpha 作为内部一致性的度量,还有一个函数 scales::alpha
用于修改颜色透明度。没有那么多例子,但话又说回来,有例子。 dplyr
甚至屏蔽了 stats
和 base
包中的函数! (而且 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 文件。