我想创建一个足够灵活的dplyr函数来获取多个过滤器。
我可以创建一个使用一个过滤器的函数:
library(tidyverse)
df <- data_frame(name = c("mike","tom","jerry"),
age = c(7,8,9),
hair_color = c("brown", "black", "brown"),
town = c("NYC","NYC","SF"))
filter_fun <- function(df = df, filter_var_1, filter_1) {
filter_var_1 <- enquo(filter_var_1)
df %>%
filter(UQ(filter_var_1) == filter_1)
}
test <- filter_fun(filter_var_1 = town, filter_1 = "NYC")
此代码有效。
但是,我希望这对多个过滤器灵活。我通过https://rpubs.com/hadley/dplyr-programming阅读了一些建议,这些建议让我觉得我需要使用!!!
和...
,但我不确定这对多个过滤条件有何影响。例如,
filter_fun <- function(df = df, filters = ..., conditions = ...) {
filters <- quos(filters)
conditions <- quos(conditions)
df %>%
filter(!!!filters == !!!conditions) -> eff
return(eff)
}
nanna <- filter_fun(filters = c(hair_color,town),
conditions = c("brown", "NYC"))
但这不起作用。错误:Error in eval(lhs, parent, parent) :
promise already under evaluation: recursive default argument reference or earlier problems?
一旦解决了这个问题,我也希望能够更改过滤器的符号。例如,
filter_fun <- function(df = df,
filters = ...,
conditions = ...,
signs = ...) {
filters <- quos(filters)
conditions <- quos(conditions)
types <- quos(signs)
df %>%
filter(!!!filters !!!signs !!!conditions) -> eff
return(eff)
}
nanna <- filter_fun(filters = c(hair_color,town,age),
conditions = c("brown", "NYC", 8),
signs = c("==", "==", "<"))
那不会工作......
谢谢!