Shiny R:如何根据selectInput输入变量动态筛选数据集
问题本质:dplyr两个函数的列名识别规则差异
dplyr::select()原生支持直接传入字符串形式的列名,input$var返回的是"height"/"mass"/"birth_year"这类字符串,刚好匹配select的参数要求,因此运行正常。dplyr::filter()遵循整洁求值(tidy evaluation)逻辑,直接传入字符串input$var时,函数会将其判定为固定的字符值做逻辑校验,而非引用数据集的对应列,因此筛选逻辑完全失效。
正确实现方案
只需要把传入filter()的字符串转为dplyr可识别的列引用即可,最稳定的写法是使用.data代词绑定对应列,完整修正后代码如下:
library(shiny) library(tidyverse) library(reactable) ui = fluidPage( selectInput(inputId = "var", label = "Select", choices = c("height", "mass", "birth_year")), reactableOutput(outputId = "table") ) server = function(input, output, session){ output$table = renderReactable({ starwars %>% select(input$var) %>% filter(between(.data[[input$var]], 50, 100)) %>% reactable(data = .) }) } shinyApp(ui, server)
你也可以选择用!!rlang::sym(input$var)替代.data[[input$var]]实现同样效果,不过.data的写法无需额外处理命名空间,环境兼容性更好,更推荐使用。
内容的提问来源于stack exchange,提问作者werN
相关产品推荐
相关产品推荐

