2017-08-26 1 views
1

Appelez la fonction ci-dessous en utilisant foo(c("b")). Les sorties sont affichées en ligne.Pourquoi `rlang :: sym` et` rlang :: quo_name` dans LHS d'expression se comportent-ils de la même façon?

Je suis confus quant à pourquoi les deux (1) df %>% mutate(!!x_ := 100 + !!x)) et (2) df %>% mutate(!!x := 100 + !!x)) fonctionnent de manière identique; basé sur dplyr programming recipes seulement (1) devrait fonctionner.

foo <- function(variables) { 

    x <- rlang::sym(variables[[1]]) 

    x_ <- quo_name(x) 

    print(x) 
    #> b 

    print(typeof(x)) 
    #> [1] "symbol" 

    print(x_) 
    #> [1] "b" 

    print(typeof(x_)) 
    #> [1] "character" 

    df <- data_frame(a = 1, b = 2) 

    print(df %>% mutate(!!x_ := 100 + !!x)) 

    #> # A tibble: 1 x 2 
    #>   a  b 
    #>  <dbl> <dbl> 
    #> 1  1 102 

    print(df %>% mutate(!!x := 100 + !!x)) 

    #> # A tibble: 1 x 2 
    #>   a  b 
    #>  <dbl> <dbl> 
    #> 1  1 102 

} 
+1

Comme mentionné dans la [documentation] (http://dplyr.tidyverse.org/articles/programming.html#setting-variable-names) vous faites référence à: * Les règles sur le LHS sont légèrement différentes: la l'opérande non-cité doit évaluer une chaîne ou un symbole *. Cela fonctionne parce que 'x_' est un caractère. –

+1

Vous avez raison! J'ai raté la partie "... ou un symbole". Si vous déplacez le commentaire à une réponse, je peux aller de l'avant et accepter cela. – Shantanu

Répondre

3

Déplacer le commentaire pour répondre.

Comme mentionné dans le par documentation vous faites référence:

Les règles du LHS sont légèrement différents: l'unquoted opérande doit à une chaîne ou un symbole.

Ici, cela fonctionne car x_ est, en fait, un caractère.