好的,感觉它应该相对简单,但我已经尝试了quote
,eval
,substitute
,enquote
的几十种方法。 ,parse
,summarize_
等等......我还没有让它发挥作用。基本上我试图计算这样的东西 - 但是使用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世界中我应该使用哪种标记进行此类查询。元编程?
答案 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)"))