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

如何在Shiny模块中正确评估gtsummary自定义参数输入

在Shiny中实现gtsummary自定义用户输入参数的评估

核心问题在于用户输入的是管道链的后半段(如%>% add_p()),直接评估会因缺少左侧的表格对象报错。以下是可行的解决方案,通过非标准求值工具安全拼接并评估用户代码:

关键思路

  1. 将用户输入的字符串解析为R表达式
  2. 将基础gtsummary表格对象与表达式拼接成完整的管道调用
  3. 在正确的环境中评估拼接后的表达式

完整简化示例代码

library(shiny)
library(gtsummary)
library(rlang)

ui <- fluidPage(
  textInput(
    "custom_cmd", 
    "输入自定义gtsummary命令(需以 %>% 开头)", 
    value = "%>% add_p()"
  ),
  actionButton("run", "生成表格"),
  gt_output("table")
)

server <- function(input, output, session) {
  # 生成基础汇总表格
  base_table <- reactive({
    trial %>% tbl_summary(by = trt)
  })
  
  # 处理用户输入并生成最终表格
  final_table <- eventReactive(input$run, {
    req(input$custom_cmd)
    
    # 解析用户输入为表达式
    cmd_expr <- parse_expr(input$custom_cmd)
    
    tryCatch({
      # 拼接基础表格与用户命令,构建完整调用
      full_call <- expr(!!base_table() !!cmd_expr)
      # 评估表达式
      eval_tidy(full_call)
    }, error = function(e) {
      showNotification(paste("命令执行失败:", e$message), type = "error")
      NULL
    })
  })
  
  # 渲染表格
  output$table <- render_gt({
    req(final_table())
    as_gt(final_table())
  })
}

shinyApp(ui, server)

核心代码解释

  • parse_expr():将用户输入的字符串转为R可识别的表达式,而非纯文本
  • !!(非标准求值):将base_table()的结果插入到表达式中,拼接成完整的管道调用(如trial %>% tbl_summary(by=trt) %>% add_p())
  • eval_tidy():在保留gtsummary上下文的环境中评估表达式,避免环境问题导致的报错
  • 错误处理:通过tryCatch()捕获用户输入的无效代码,给出友好提示

额外优化

如果要支持用户输入不带%>%的命令(如直接输入add_p()),可以在解析前预处理字符串:

cmd <- input$custom_cmd
if (!stringr::str_starts(cmd, "%>%")) {
  cmd <- paste0("%>% ", cmd)
}
cmd_expr <- parse_expr(cmd)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:39:54