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

问题描述 投票:2回答:1

我正在尝试使用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)))
 }
r dplyr quosure
1个回答
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

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

lst <- setNames(vector('list', length(groupFields)), groupFields)
for(var in groupFields){
   var <- rlang::sym(var)
   lst[[var]] <- groupedMean(!!var)
}
lst
© www.soinside.com 2019 - 2024. All rights reserved.