I'm writing a function that takes several parameters, strings or vectors of strings that correspond to attributes I'd like to filter on. I'd also like to write my function so that when a filter attribute isn't specified, it is simply ignored and the other filter attributes work.
Why does this shorthand using quo
not work this way, and how can I change it so that it does?
library(dplyr); library(datasets)
filterhec <- function(hair = '', eyecolor = '', sex = '') {
hec <- as.data.frame(datasets::HairEyeColor)
# Filter condition variable, which changes depending on parameters
fcond <- quo(
(ifelse(hair == '', 1, Hair == hair)) &
(ifelse(all(eyecolor == ''), 1, Eye %in% eyecolor)) &
(ifelse(sex == '', 1, Sex == sex)))
filter(hec, !!fcond)
}
filterhec(hair = 'Black', eye = c('Brown', 'Blue'))
# Hair Eye Sex Freq
# 1 Black Brown Male 32
# 2 Brown Brown Male 53
# 3 Red Brown Male 10
# 4 Blond Brown Male 3
# 5 Black Blue Male 11
# 6 Brown Blue Male 50
# 7 Red Blue Male 10
# 8 Blond Blue Male 30
# 9 Black Hazel Male 10
#
# ^Expected dataframe where Hair is always 'Black' and Eye is 'Brown' or 'Blue'
The arguments of your function are already quoted as character vectors and the variables on which you filter are also hard coded. Therefore, I don't think there is any need for
quo
. You can do it like this: