R函数,表达式作为dplyr汇总的参数

时间:2017-03-17 10:08:27

标签: r dplyr nse

好的,感觉它应该相对简单,但我已经尝试了quoteevalsubstituteenquote的几十种方法。 ,parsesummarize_等等......我还没有让它发挥作用。基本上我试图计算这样的东西 - 但是使用summarise参数的变量表达式:

mtcars %>% group_by(cyl) %>% summarise(wt=mean(wt),hp=mean(hp))

得到以下特性:

# A tibble: 3 × 3
    cyl       wt        hp   
    <dbl>    <dbl>     <dbl> 
1     4 2.285727  82.63636 
2     6 3.117143 122.28571 
3     8 3.999214 209.21429

我尝试的其中一件事是:

  x2 <- "wt=mean(wt),hp=mean(hp)"
  mtcars %>% group_by(cyl) %>% summarise(eval(parse(text=x2)))

得到以下特性:

Error in eval(substitute(expr), envir, enclos) : 
  <text>:1:12: unexpected ','
1: wt=mean(wt),

但是遗漏第二个论点(",hp=mean(hp")会让你不再:

> x2 <- "wt=mean(wt)"
> mtcars %>% group_by(cyl) %>% summarise(eval(parse(text=x2)))
Error in eval(substitute(expr), envir, enclos) : object 'wt' not found

我会饶恕你所尝试的所有其他事情 - 我显然错过了关于如何在函数参数中处理表达式的事情。

那么这里适当的方法是什么?请记住,我最终真的想要这样的东西:

getdf <- function(df,sumarg){
  df %>% group_by(cyl) %>% summarise(sumarg)
  df
}

还不确定在R世界中我应该使用哪种标记进行此类查询。元编程?

1 个答案:

答案 0 :(得分:4)

为了获得最大的灵活性,我会使用...参数,使用lazyeval捕获这些点,然后传递给summarise_

getdf <- function(df, ...){ 
    df %>% group_by(cyl) %>% summarise_(.dots = lazyeval::lazy_dots(...)) 
}

然后你可以直接做:

getdf(mtcars, wt = mean(wt), hp = mean(hp))
# A tibble: 3 × 3
    cyl       wt        hp
  <dbl>    <dbl>     <dbl>
1     4 2.285727  82.63636
2     6 3.117143 122.28571
3     8 3.999214 209.21429

没有...的一种方法是在列表中传递参数,尽管您需要使用公式或引用。 E.g:

getdf2 <- function(df, args){ 
    dots <- lazyeval::as.lazy_dots(args)
    df %>% group_by(cyl) %>% summarise_(.dots = dots) 
}

并用作:

getdf(mtcars, list(wt = ~mean(wt), hp = ~mean(hp)))

getdf(mtcars, list(wt = "mean(wt)", hp = "mean(hp)"))