R dplyr当函数输入是变量时的Quosure逻辑

时间:2017-12-20 16:34:24

标签: r dplyr quosure

我试图使用quosure获取自定义group_by函数。当函数的输入是字段的名称时,它工作正常。但是,如果我想创建一个包含要插入到函数中的字段名称的变量,我会因为引用该字段而卡住。任何人都知道如何解决这个问题。请看下面的

 groupedMean<-function(field){  
    expr<-enquo(field)

   mtcars%>%
       group_by(!!expr)%>%
       summarise(mean(mpg))  
 }

 #Works
 groupedMean(cyl)

 #Doesn't work
 groupFields<-c("cyl","gear")

 for(var in groupFields){
    print(groupedMean(eval(var)))
 }

1 个答案:

答案 0 :(得分:3)

一种选择是使用sym

中的rlang进行转换
for(var in groupFields){
     var <- rlang::sym(var)
     print(groupedMean(!!var))
}
# A tibble: 3 x 2
#    cyl `mean(mpg)`
#  <dbl>       <dbl>
#1     4    26.66364
#2     6    19.74286
#3     8    15.10000
# A tibble: 3 x 2
#   gear `mean(mpg)`
#  <dbl>       <dbl>
#1     3    16.10667
#2     4    24.53333
#3     5    21.38000

而不是print,以供以后使用,输出可以存储在list

lst <- setNames(vector('list', length(groupFields)), groupFields)
for(var in groupFields){
   var <- rlang::sym(var)
   lst[[var]] <- groupedMean(!!var)
}
lst