gpt4 book ai didi

r - 什么!运算符在R中表示平均值,尤其是在!! sym (“x”上下文中)

转载 作者:行者123 更新时间:2023-12-02 09:06:59 25 4
gpt4 key购买 nike

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

具体来说,我正在看一个涉及短语的函数a = !!sym("x"),其中"x"是字符串。我以为sym通过将字符串转换为对象来工作,因此a = sym("x")会将a设置为等于对象x。那里的!!是什么?我读到它后面没有引号,但我认为sym本身没有引号的字符串吗?

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

最佳答案

当您将字符串转换为符号时,它会在不带引号的情况下打印出来,但这并不是取消引号的含义(我们将在最后进行讨论)。
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 - 什么!运算符在R中表示平均值,尤其是在!! sym (“x”上下文中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57136322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com