如何在函数内的dplyr过滤器中使用动态参数

时间:2018-12-05 19:15:41

标签: r dplyr tidyverse

我正在尝试添加在dplyr中使用动态数量的变量进行过滤的功能。我希望用户能够在函数调用即...内以简单的方式输入命令-以下示例应有帮助。用户只需将seg1 == 'b'seg2 == 'd'输入到函数my_func(example_data, seg1 = 'b', seg2 = 'd')中就可以将library('tidyverse') example_data = tibble(seg1 = c('a','b','b','c'), seg2 = c('d', 'd', 'd', 'e'), out = c(1, 10, 20, 40)) my_func = function(dat, ...){ args = list(...) arg_names = names(args) ### ???? dat = dat %>% filter(???) ### ???? return(dat) } my_func(example_data, seg1 = 'b', seg2 = 'd') # Desired output > example_data %>% filter(seg1 == 'b', seg2 == 'd') # A tibble: 2 x 3 seg1 seg2 out <chr> <chr> <dbl> 1 b d 10 2 b d 20 和{{1}}进行细分,但是所有尝试均失败。使用标准SQL可以轻松做到这一点,只是不熟悉NSE格式。

{{1}}

2 个答案:

答案 0 :(得分:2)

不要让我解释这一点,因为大多数 rlang 仍然对我来说是难以形容的。我是通过随机尝试来解决的。

my_func = function(dat, ...){
  args <- rlang::enexprs(...)
  dat %>%
    filter(!!! args)
}

> my_func(example_data, seg1 == 'b', seg2 == 'd')
# A tibble: 2 x 3
  seg1  seg2    out
  <chr> <chr> <dbl>
1 b     d        10
2 b     d        20

请注意使用==,因此我们将表达式传递给...,而不是命名参数。

答案 1 :(得分:2)

如果您真的想将这些命名参数更改为相等过滤器,请使用另一种选择。

my_func = function(dat, ...){
  args <- enquos(...)
  ex_args <- unname(imap(args, function(expr, name) quo(!!sym(name)==!!expr)))

  dat %>% filter(!!!ex_args)
}

my_func(example_data, seg1 = 'b', seg2 = 'd')