背景
提供的函数实现以下功能:
- 使用用户提供的表达式对数据框进行子集筛选
- 选择所需列
- 在结果向量上应用自定义汇总函数并返回标量
base
方法
summarise_filtered <-
function(df,
subset_arg,
summary_fun = c("min", "max", "median"),
select_col) {
summary_fun <- match.arg(summary_fun)
sbst_vals <-
subset.data.frame(
df,
subset = eval(parse(text = subset_arg)),
drop = TRUE,
select = eval(parse(text = select_col))
)
do.call(match.fun(summary_fun), list(sbst_vals))
}
结果
summarise_filtered(mtcars, "am == 1", "min", "cyl")
# [1] 4
summarise_filtered(mtcars, "am == 1", "max", "cyl")
# [1] 8
挑战
我对使用dplyr管道语法重新编写上述函数感兴趣。我的初始尝试符合基本要求:
summarise_filtered_dplyrish <-
function(df,
subset_arg,
summary_fun,
select_col) {
df %>%
filter({{subset_arg}}) %>%
summarise(across(.cols = {{select_col}}, .fns = summary_fun)) %>%
pull({{select_col}})
}
被调用时:
summarise_filtered_dplyrish(mtcars, am == 1, min, cyl)
# [1] 4
问题
我希望这个函数能够使用:
summarise_filtered_dplyrish(mtcars, "am == 1", "min", "cyl")
语法,除了已经工作的解决方案之外,还需要一种方法来实现。如何做到这一点?截至目前,上述调用会生成错误:
错误
错误:使用
filter()
输入..1
出现问题。x 输入..1
必须是逻辑向量,而不是字符。 ℹ 输入..1
是"am == 1"
。运行rlang::last_error()
以查看错误发生的位置。