如何编写同时兼容Shiny输入与Tidyverse NSE的R函数,避免代码重复
实现兼容NSE与字符串输入的自定义Tidyverse函数
直接用rlang包提供的ensym()搭配注入运算符!!即可实现需求,无需维护两套逻辑:
library(dplyr) library(rlang) flexible_input <- function(var){ # 自动兼容字符串和未加引号的列名输入 var_sym <- ensym(var) mtcars %>% select(!!var_sym) } # 两种调用方式均生效 flexible_input(mpg) flexible_input('mpg')
原理解释
ensym()会自动识别输入类型:如果传入未加引号的列名,直接捕获为符号对象;如果传入字符串,将字符串内容转为对应的列名符号!!是tidyverse的注入运算符,会把处理好的符号注入到dplyr的函数上下文里执行,完全兼容dplyr的NSE逻辑- 该方案天然适配Shiny场景:从Shiny的input组件拿到的字符串列名可以直接传入函数,不需要额外做格式转换
多参数扩展
如果需要支持同时传入多个列名,可改用ensyms()搭配!!!实现:
flexible_multi_input <- function(...){ vars_syms <- ensyms(...) mtcars %>% select(!!!vars_syms) } # 两种调用方式均生效 flexible_multi_input(mpg, cyl, disp) flexible_multi_input('mpg', 'cyl', 'disp')
内容的提问来源于stack exchange,提问作者student
相关产品推荐
相关产品推荐

