基于tidy evaluation实现支持任意运算符的R多条件灵活过滤函数
扩展支持多运算符的动态过滤函数实现
我们只需要在原有实现的基础上,将运算符也作为可注入的表达式元素参与quosure构造即可,核心利用了R中运算符本质为函数的特性,将字符串形式的运算符转为符号后解引用调用即可。
完整实现代码
library(tidyverse) library(gapminder) my_filter <- function(df, cols, ops, vals){ # 构造单组过滤条件的quosure build_filter <- function(col, op, val) { quo(!!sym(op)(!!sym(col), {{val}})) } # 遍历参数列表生成所有过滤条件 filter_exprs <- pmap(list(cols, ops, vals), build_filter) # 解包条件传入filter执行过滤 filter(df, !!!filter_exprs) }
调用测试
cols <- list("country", "year") ops <- list("%in%", ">=") vals = list(c("Albania", "France"), 2007) gapminder %>% my_filter(cols, ops, vals)
上述代码会返回gapminder数据集中,国家为阿尔巴尼亚/法国、年份≥2007的所有行,完全符合预期调用需求。
补充说明
- 三个输入列表
cols、ops、vals的长度必须完全相等,每个位置的三个元素对应一组过滤条件 - 支持所有R中合法的比较运算符,包括
==、!=、>、<、>=、<=、%in%等 - 该实现完全适配Shiny开发场景,前端用户选择的变量、运算符、输入值可直接转为三个列表传入函数,即可完成动态过滤需求
内容的提问来源于stack exchange,提问作者Till
相关产品推荐
相关产品推荐

