2017-08-26 34 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_實際上是一個字符。

相關問題