R中的双冒号(::)是什么?

时间:2016-02-06 12:27:07

标签: r scope namespaces operators scoping

我正在关注Rbloggers中的一个教程并发现使用双冒号,我在线查看,但我找不到他们使用的解释。 以下是它们的使用示例。

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

据我所知,它会创建一个数据框,但我不明白它们的用途。

2 个答案:

答案 0 :(得分:20)

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

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

因此,例如,如果您想使用dplyr或base package中的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是我加载的最后一个库,即第一个会话。因此,当您在代码中使用任何函数时,首先在tidyr - &gt;中搜索它。然后data.table - &gt;然后dplyr等等,最后查找base包。因此,在此过程中,当包之间存在功能名称重叠时,加载最后一个的功能名称将覆盖先前的功能名称。要避免此屏蔽,请在R代码中指定查找函数的位置。因此,这里base::intersect将使用基库中的函数而不是dplyr。或者,您可以使用以避免加载完整的库。这有积极的和消极的。阅读链接并了解更多信息。

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

Compare library(), require(), ::

Namespace

答案 1 :(得分:8)

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

package::functionname