R中的双冒号(::)是啥?

Posted

技术标签:

【中文标题】R中的双冒号(::)是啥?【英文标题】:What are the double colons (::) in R?R中的双冒号(::)是什么? 【发布时间】:2016-05-16 10:09:20 【问题描述】:

我正在关注 Rbloggers 中的教程,发现了双冒号的用法,我在网上查找,但找不到关于它们使用的解释。 以下是它们的使用示例。

df <- dplyr::data_frame(
  year = c(2015, NA, NA, NA), 
  trt = c("A", NA, "B", NA)
)

我知道它会创建一个数据框,但我不明白它们的目的。

【问题讨论】:

查看帮助文件...?'::' 谢谢,我不知道如何访问 R 中的字符帮助! help("::") 如果?给你带来麻烦,也可以使用。函数总是可以写在引号中。 强相关:Is it good practice to call functions in a package via :: 【参考方案1】:

您现在可能已经查看了帮助页面,:: 的使用有助于访问该特定包中的确切功能。当您加载dplyr 时,您可能会收到如下消息..

The following objects are masked from ‘package:base’:
       intersect, setdiff, setequal, union

因此,例如,如果您想使用 dplyr 或基本包中的 intersect 函数,则需要使用 :: 双冒号指定。用法如下

mtcars$model <- rownames(mtcars)
first <- mtcars[1:20, ]
second <- mtcars[10:20, ]
dplyr::intersect(first, second)
base::intersect(first, second)

更新:添加额外说明

注意:加载库的顺序决定了特定函数的优先访问权限。不同包的开发者倾向于使用相同的函数名。但是,当 R 遇到一个函数时,它会按顺序运行特定会话已加载的不同库。您可以通过运行(.packages())

在会话中检查包
 [1] "tidyr"      "data.table" "dplyr"      "stats"     
 [5] "graphics"   "grDevices"  "utils"      "datasets"  
 [9] "methods"    "base"    

正如您在上面的示例会话中看到的,tidyr 是我加载的最后一个库,它是 r 会话的第一个条目。因此,当您在代码中使用任何函数时,首先在 tidyr -> 中搜索它,然后在 data.table -> 然后 dplyr 等等,最后查找 base 包。因此,在此过程中,当包之间存在函数名称重叠时,加载最后一个的包会掩盖之前的包。为了避免这种屏蔽,您可以在 R 代码中指定查找函数的位置。因此,这里base::intersect 将使用基础库中的函数而不是dplyr。或者,您可以使用来避免加载完整的库。这有积极和消极的一面。阅读链接并了解更多信息。

运行并检查差异。 这里有一些资源供您了解。

Compare library(), require(), ::

Namespace

【讨论】:

使用search() 比使用.packages() 更好,因为名称也可以解析到附加列表/环境/等。 这个答案没有说明一个非常重要的点:您必须已经安装了一个包,它的功能才能使用:: 进行提取。 (但你不需要加载那个包)【参考方案2】:

在多个包中可能有多个同名的函数。双冒号运算符允许您指定所需的特定功能:

package::functionname

【讨论】:

以上是关于R中的双冒号(::)是啥?的主要内容,如果未能解决你的问题,请参考以下文章

c语言的双冒号是啥意思::

双冒号是啥意思?

Java 中的双冒号“::”

java :: Java中的双冒号操作符

“::before”和“:before”中的双冒号和单冒号的区别

『C/C++养成计划』C++中的双冒号::名解析(Scope Resolution Operator)