`as.name` 和 `sym` 有什么区别?

What's the difference between `as.name` and `sym`?

我正在尝试围绕标准、非标准评估、quosures 等进行思考。在许多示例中,我看到传递的字符串变量被转换为 dplyr-可用形式 [=12] =] 或 symrlang 包。

它们在管道中可以互换吗?哪些情况会因其中之一而失败?

编辑: 我无法轻松创建 as.name 无法工作的场景。 Hadley 似乎同意 as.name 可能有效。虽然这是使用 select 确实很稳健,但尝试使用 group_bysummarise 似乎没有区别。

稳健select:

 varName <- "Sepal.Length"
 select(iris, varName) #This works

几个例子as.namesym没有区别我运行.

iris %>%
    group_by(!!as.name(varName))
iris %>% 
    group_by(!!sym(varName))

尝试更改encoding

var1 <- `Encoding<-`(varName, "unknown") 

as.namesym 仍然有效。

原回答:

来自文档?sym

These functions take strings as input and turn them into symbols.

as.name()相反,它们将字符串转换为本机编码beforehand.This是必要的,因为符号会悄悄地删除字符串的编码标记(参见set_str_encoding())。

因此似乎使用 sym 和相关函数消除了编码的麻烦。