在用户定义的函数中取消引用变量

时间:2017-05-10 18:29:48

标签: r function dplyr

我需要使用用户定义的函数绑定两个data.frames。例如,让我们假设数据框看起来像这样。

library(dplyr)
library(lazyeval)

df<-data.frame(type1=c("a","b","c","a","b","c",NA),type2=c("d","e","f","d","e","f","f"))

        f<-function(x){
      y<-df%>%
        dplyr::filter_(lazyeval::interp(~!is.na(x),x=as.name(x)))%>%
        dplyr::group_by_(x)%>%
        dplyr::summarize("Sum"=sum(type2=="d"))
      y<-dplyr::bind_rows(y,data.frame(x="Total",Sum=sum(y$Sum)))
    return(y)
    }

    result_f<-f("type1")

问题是该函数假定第二个数据帧中变量“Total”的名称是“x”而不是“Total”,由于与第一个数据帧不匹配而创建了一个额外的列。

该函数如何将x解释为变量而不是字符串? Unquoting?怎么样?

1 个答案:

答案 0 :(得分:1)

您可以将功能中的最后一行更改为

y <- dplyr::bind_rows(y,setNames(data.frame("Total",sum(y$Sum)), c(x, "Sum")))

这会将您尝试绑定的data.frame的名称设置为原始名称。

在花费太多时间学习dplyr中的所有下划线函数之前,请注意在下一个版本(0.6)中,它们将被完全不同的非标准评估方法所取代。在此处阅读更多内容:https://blog.rstudio.org/2017/04/13/dplyr-0-6-0-coming-soon/