【问题标题】:Passing column name to the function as variable将列名作为变量传递给函数
【发布时间】:2017-04-20 16:50:20
【问题描述】:

我对 R 和 dplyr 库比较陌生。如何让函数使用变异列的名称作为函数中的参数传递?

例如,我希望“test”作为变异列的名称,但我得到“y”。我究竟做错了什么?谢谢

 library(dplyr)
    d <- data.frame(alpha=1:3, beta=4:6)
    d
    compare_status<-function(x,y){
      x %>% mutate(y=ifelse(alpha ==2,"G2","0"))
    }

    compare_status(d,test)

【问题讨论】:

  • 我们昨天刚刚讨论过这个问题。 R 严格不评估对象的名称。有一个新的 dplyr 即将问世,声称能够解决这个问题。如果您愿意,请下载开发版本以进行全面测试。并阅读本教程dplyr.tidyverse.org/articles/programming.html
  • 感谢您的指点。是否仅适用于“变异”的函数?
  • 不,据我所知,命名位置的所有部分都很严格。
  • 可能存在限制以便用户可以写c(x=1) 而不是c("x"=1)。在这一点上,即使 R 大神认为适合评估左侧,他们也不能,因为过去编写的这么多代码取决于输入的值是显示的值。改变太晚了。

标签: r dplyr


【解决方案1】:

我们可以为此使用开发版dplyr 语法(即将发布0.6.0

compare_status<-function(x,y){
   y <- quo_name(enquo(y))
    x %>%
      mutate(!!y := ifelse(alpha ==2,"G2","0"))
}

compare_status(d,test)
#  alpha beta test
#1     1    4    0
#2     2    5   G2
#3     3    6    0

enquo 接受输入参数并转换为 quosure,然后将其转换为带有 quo_name 的字符串,并使用 !!UQ 不带引号,用于评估作为分配 lhs 上的列名(@ 987654329@)

【讨论】: