【问题标题】: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 scope namespaces operators scoping


【解决方案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

【讨论】:

    猜你喜欢
    • 2011-03-01
    • 2019-09-14
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多