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中的双冒号(::)是啥?的主要内容,如果未能解决你的问题,请参考以下文章