简体   繁体   中英

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

I'm trying to wrap my head around standard, non-standard evaluation, quosures, etc. In many examples, I see passed string variable being transformed into dplyr -usable form either with as.name or with sym of rlang package.

Are they interchangeable in pipes? What are the cases that will fail for one or the other?

EDIT : I could not readily create a scenario where as.name fails to work. Hadley seems to agree that as.name might work. Although this is using select which really is robust, trying with group_by and summarise appears to have no difference.

Robust select :

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

No difference between as.name and sym for several examples I run.

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

Attempts to change encoding :

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

Both as.name and sym still worked.

Original answer :

From the docs ?sym :

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

Contrarily to as.name() , they convert the strings to the native encoding beforehand.This is necessary because symbols remove silently the encoding mark of strings (see set_str_encoding() ).

It therefore seems that using sym and related functions eliminates the trouble to do with encoding.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM