1) sym - 我们可以转换为symbols 和evaluate (!!)。 [[ 主要用于提取list 元素。由于 OP 将 'vars' 和 'cond' 显示为 vectors [ 足以提取每个元素
nycflights13::planes %>%
filter(
!!rlang::sym(vars[1]) == cond[1],
!!rlang::sym(vars[2]) == cond[2]
)
2) parse_expr- 一个选项是使用paste 或str_c 从stringr 创建一个表达式,然后解析该表达式
expr1 <- str_c(vars, str_c('"', cond, '"'), sep="==", collapse=" & ")
nycflights13::planes %>%
filter(!! rlang::parse_expr(expr1))
# A tibble: 298 x 9
# tailnum year type manufacturer model engines seats speed engine
# <chr> <int> <chr> <chr> <chr> <int> <int> <int> <chr>
# 1 N10156 2004 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# 2 N10575 2002 Fixed wing multi engine EMBRAER EMB-145LR 2 55 NA Turbo-fan
# 3 N11106 2002 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# 4 N11107 2002 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# 5 N11109 2002 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# 6 N11113 2002 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# 7 N11119 2002 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# 8 N11121 2003 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# 9 N11127 2003 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
#10 N11137 2003 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# … with 288 more rows
3) map2/reduce - 如果我们有多个列,那么我们可以使用filter_at,但这里的“条件”不同。所以,一种选择是map2
library(purrr)
library(dplyr)
map2(vars, cond, ~ nycflights13::planes %>%
transmute(ind = !! rlang::sym(.x) == .y) %>%
pull(ind)) %>%
reduce(`&`) %>%
filter(nycflights13::planes, .)
# A tibble: 298 x 9
# tailnum year type manufacturer model engines seats speed engine
# <chr> <int> <chr> <chr> <chr> <int> <int> <int> <chr>
# 1 N10156 2004 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# 2 N10575 2002 Fixed wing multi engine EMBRAER EMB-145LR 2 55 NA Turbo-fan
# 3 N11106 2002 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# 4 N11107 2002 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# 5 N11109 2002 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# 6 N11113 2002 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# 7 N11119 2002 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# 8 N11121 2003 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# 9 N11127 2003 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
#10 N11137 2003 Fixed wing multi engine EMBRAER EMB-145XR 2 55 NA Turbo-fan
# … with 288 more rows