`as.name` 和 `sym` 有什么区别?
What's the difference between `as.name` and `sym`?
我正在尝试围绕标准、非标准评估、quosures 等进行思考。在许多示例中,我看到传递的字符串变量被转换为 dplyr
-可用形式 [=12] =] 或 sym
的 rlang
包。
它们在管道中可以互换吗?哪些情况会因其中之一而失败?
编辑:
我无法轻松创建 as.name
无法工作的场景。 Hadley 似乎同意 as.name
可能有效。虽然这是使用 select
确实很稳健,但尝试使用 group_by
和 summarise
似乎没有区别。
稳健select
:
varName <- "Sepal.Length"
select(iris, varName) #This works
几个例子as.name
和sym
没有区别我运行.
iris %>%
group_by(!!as.name(varName))
iris %>%
group_by(!!sym(varName))
尝试更改encoding
:
var1 <- `Encoding<-`(varName, "unknown")
as.name
和 sym
仍然有效。
原回答:
来自文档?sym
:
These functions take strings as input and turn them into symbols.
与as.name()
相反,它们将字符串转换为本机编码beforehand.This是必要的,因为符号会悄悄地删除字符串的编码标记(参见set_str_encoding()
)。
因此似乎使用 sym
和相关函数消除了编码的麻烦。
我正在尝试围绕标准、非标准评估、quosures 等进行思考。在许多示例中,我看到传递的字符串变量被转换为 dplyr
-可用形式 [=12] =] 或 sym
的 rlang
包。
它们在管道中可以互换吗?哪些情况会因其中之一而失败?
编辑:
我无法轻松创建 as.name
无法工作的场景。 Hadley 似乎同意 as.name
可能有效。虽然这是使用 select
确实很稳健,但尝试使用 group_by
和 summarise
似乎没有区别。
稳健select
:
varName <- "Sepal.Length"
select(iris, varName) #This works
几个例子as.name
和sym
没有区别我运行.
iris %>%
group_by(!!as.name(varName))
iris %>%
group_by(!!sym(varName))
尝试更改encoding
:
var1 <- `Encoding<-`(varName, "unknown")
as.name
和 sym
仍然有效。
原回答:
来自文档?sym
:
These functions take strings as input and turn them into symbols.
与as.name()
相反,它们将字符串转换为本机编码beforehand.This是必要的,因为符号会悄悄地删除字符串的编码标记(参见set_str_encoding()
)。
因此似乎使用 sym
和相关函数消除了编码的麻烦。