在我自己的函数中使用summarise_和group_by_

Nic*_*abo 2 r dplyr

我想创建一个将使用summarise_group_by_功能的简单函数.我知道非标准评估存在问题,但我可以解决它.

library(dplyr)
test_function <- function(.data, ..., variable){
  dots <- quote(mean(substitute(variable)))
    group_by_(.data,.dots = lazyeval::lazy_dots(...)) %>% 
    summarise_(.dots = dots)
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试这个:

test_function(ggplot2::diamonds, cut, clarity, variable = price)
Run Code Online (Sandbox Code Playgroud)

这是行不通的.

谢谢,

MrF*_*ick 5

你的问题是你的问题quote().报价正在逃避,substitute()所以它没有按照你想要的方式运行.如果您bquote()改为使用,则可以调整替换并将结果插入表达式以获得所需内容

test_function <- function(.data, ..., variable){
    dots <- bquote(mean(.(substitute(variable))))
    group_by_(.data,.dots = lazyeval::lazy_dots(...)) %>% 
    summarise_(.dots = dots)
}

test_function(diamonds, cut, clarity, variable = price)
# Source: local data frame [40 x 3]
# Groups: cut
# 
#     cut clarity mean(price)
# 1  Fair      I1    3703.533
# 2  Fair     SI2    5173.916
# 3  Fair     SI1    4208.279
# 4  Fair     VS2    4174.724
# 5  Fair     VS1    4165.141
Run Code Online (Sandbox Code Playgroud)

  • 好的,是的,标准评估`dplyr`功能的范围规则有点棘手.`dots < - eval(bquote(~FUN(.(替代(变量)))))`似乎有效.详细了解为什么超出了这个特定问题的范围. (2认同)