You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Shiny正确求值textInput输入的表达式以实现数据集筛选

解决方案

核心原因

input$txt返回的是字符串格式的文本,dplyr的filter()默认不支持直接将字符串作为过滤条件执行,需要先将字符串解析为R的可执行表达式,再通过tidyeval的注入机制传入过滤逻辑。

修正后完整代码

library(shiny)
library(tidyverse)
library(reactable)
library(rlang)

ui = fluidPage(
  textInput("txt", "Filter Data", placeholder = "示例输入:mass > 100"),
  reactableOutput(outputId = "table")
)

server = function(input, output, session){
  output$table = renderReactable({
    req(input$txt)
    # 将输入的字符串解析为表达式
    filter_exp <- parse_expr(input$txt)
    dplyr::starwars %>%
      # !! 是注入运算符,将解析好的表达式传入filter的求值环境
      filter(!!filter_exp) %>%
      reactable()
  })
}

shinyApp(ui, server)

注意事项

  • 该方案仅适用于内部可信使用场景,公开对外的Shiny应用禁止使用该逻辑:恶意用户可构造特殊输入执行任意代码,存在严重的代码注入安全风险。
  • 若需对外提供过滤能力,建议替换为「字段选择下拉框+比较符选择下拉框+数值输入框」的固定组合方案,避免直接解析用户输入的自由文本。

内容的提问来源于stack exchange,提问作者werN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:36:06