2017-08-26 4 views
1

foo(c("b"))を使用して以下の関数を呼び出します。出力はインラインで表示されます。なぜ式のLHS内の `rlang :: sym`と` rlang :: quo_name`も同様に動作しますか?

私はなぜ(1)df %>% mutate(!!x_ := 100 + !!x))と(2)df %>% mutate(!!x := 100 + !!x))が同じように動作するのか混乱しています。 dplyr programming recipesに基づいてのみ動作するはずです(1)。

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

[documentation](http://dplyr.tidyverse.org/articles/programming.html#setting-variable-names)に記載されているとおり、以下を参照してください。* LHSのルールは少し異なります。引用符で囲まれていないオペランドは、文字列またはシンボル*に評価されるべきです。 'x_'は文字なので動作します。 –

+1

あなたは正しいです!私は "...またはシンボル"の部分を見逃しました。コメントを回答に移すと、私は先に進み、それを受け入れることができます。 – Shantanu

答えて

3

回答に移動するコメント。

あなたが参照しているdocumentationで述べたようあたり:

LHS上のルールは若干異なります:引用符で囲まれていないオペランド は文字列または記号に評価する必要があります。

ここでは、x_が実際には文字なので動作します。

関連する問題