是啥!!运算符在 R 中的意思,特别是在上下文中 !!sym("x")

Posted

技术标签:

【中文标题】是啥!!运算符在 R 中的意思,特别是在上下文中 !!sym("x")【英文标题】:What does the !! operator mean in R, particularly in the context !!sym("x")是什么!!运算符在 R 中的意思,特别是在上下文中 !!sym("x") 【发布时间】:2019-11-29 20:34:10 【问题描述】:

什么是“!!”在 R 中做,你为什么要使用它?

具体来说,我正在研究一个涉及短语的函数 a = !!sym("x") 其中"x" 是一个字符串。我认为sym 通过将字符串转换为对象来工作,所以a = sym("x") 将设置a 等于对象x!! 有什么用?我读到它不引用它后面的任何内容,但我认为 sym 本身没有引用字符串?

我还看到!! 与其他功能一起使用。它在做什么?

【问题讨论】:

可以查看help("!!") youtu.be/nERXS3ssntw 【参考方案1】:

当您将字符串转换为符号时,它会在不带引号的情况下打印,但这不是不带引号的意思(我们将在最后讨论)。

rlang::sym() 正在从字符串创建一个符号,它与 base::as.symbol() 几乎相同(与此答案无关的微小差异),它本身就是 base::as.name() 的别名:

nm <- "Sepal.Width"
x <- rlang::sym(nm)
x
#> Sepal.Width
typeof(x)
#> [1] "symbol"
identical(x, as.symbol(nm))
#> [1] TRUE

那些不起作用,因为xnm分别是一个符号和一个字符,所以我不能将它们乘以2

dplyr::mutate(head(iris),SW2 = nm * 2)
#> Error in nm * 2: argument non numérique pour un opérateur binaire
dplyr::mutate(head(iris),SW2 = x * 2)
#> Error in x * 2: argument non numérique pour un opérateur binaire

!! 自己不做任何事情,也不是真正的操作员,但它告诉mutate() 做某事,因为mutate() 旨在识别它。

它告诉mutate() 的行为就像!!x 被x 的引用内容所取代。

# equivalent to dplyr::mutate(head(iris), Sepal.Width * 2)
dplyr::mutate(head(iris), !!x * 2)
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#> 1          5.1         3.5          1.4         0.2  setosa
#> 2          4.9         3.0          1.4         0.2  setosa
#> 3          4.7         3.2          1.3         0.2  setosa
#> 4          4.6         3.1          1.5         0.2  setosa
#> 5          5.0         3.6          1.4         0.2  setosa
#> 6          5.4         3.9          1.7         0.4  setosa
#>   Sepal.Width * 2
#> 1             7.0
#> 2             6.0
#> 3             6.4
#> 4             6.2
#> 5             7.2
#> 6             7.8

dplyr::mutate(head(iris), !!sym("Sepal.Width") * 2) 会给出相同的输出。

查看其他等效调用可能更容易理解为什么称为取消引用:

quoted <- quote(Sepal.Width * 2)
dplyr::mutate(head(iris), !!quoted)

更多详情请见help("!!")

【讨论】:

以上是关于是啥!!运算符在 R 中的意思,特别是在上下文中 !!sym("x")的主要内容,如果未能解决你的问题,请参考以下文章

Apache Kafka 上下文中的“重新平衡”是啥意思?

在编程的上下文中,“代数”是啥意思?

%op% 运算符是啥意思?例如“%in%”?

按位异或(异或)是啥意思?

OpenGL上下文中的逻辑缓冲区是啥?

问号和点运算符是啥意思?在 C# 6.0 中是啥意思?