为什么表达式LHS中的`rlang :: sym`和`rlang :: quo_name`表现相似?

时间:2017-08-26 15:17:46

标签: r dplyr rlang tidyeval

使用foo(c("b"))调用下面的函数。输出以内联方式显示。

我很困惑为什么(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 个答案:

答案 0 :(得分:4)

移动评论回答。

正如您所指的documentation所述:

  

LHS上的规则略有不同:不带引号的操作数   应评估为字符串或符号

这里有效,因为x_实际上是一个角色。