将字符串转换为符号后,它会打印不带引号的内容,但这并不是去引号的意思(我们会在结束时回到这点)。
rlang::sym()
从字符串中创建一个符号,它几乎与base::as.symbol()
相同(对于这个答案来说微小的差异不相关),它本身是 base::as.name()
的别名:
nm <- "Sepal.Width"
x <- rlang::sym(nm)
x
typeof(x)
identical(x, as.symbol(nm))
那些方法行不通,因为x
和nm
分别是符号和字符,所以我不能将它们乘以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
。
dplyr::mutate(head(iris), !!x * 2)
dplyr::mutate(head(iris), !!sym("Sepal.Width") * 2)
会给出相同的输出。
为什么它被称为不引用,可能更容易理解,通过查看这个等效调用:
quoted <- quote(Sepal.Width * 2)
dplyr::mutate(head(iris), !!quoted)
查看help("!!")
获取更多详细信息。
help("!!")
。 - akrun