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

Shiny应用开发求助:基于单选按钮输入生成数据表格并保留用户输入值

解决你的Shiny应用问题:保留输入值与动态生成表格

首先,我注意到你代码里有几个小问题得先修正,这是解决后续问题的基础:

  • 所有单选按钮的inputId都是Id037,这会导致Shiny无法区分不同问题的输入,必须给每个问题分配唯一的ID
  • 第二个Criteria_2的条件面板里写了input.stats == 'Criteria 2',应该改成input.select == 'Criteria_2'(注意下划线和变量名)

接下来针对你提到的两个核心问题,我给你修改后的完整代码,同时解释关键部分:

完整修改后的代码

library(shiny)
library(shinythemes)
library(shinyWidgets)
library(DT)

ui <- fluidPage(theme = shinytheme("united"), 
                # Application title
                titlePanel("TITLE"),
                sidebarLayout(
                  sidebarPanel(
                    selectInput("select", label = helpText("Select a criteria"),
                                choices = list("Criteria_1", "Criteria_2"),
                                selected = "Criteria_1")), # 修正selected值,避免NULL报错
                  mainPanel(tabsetPanel(
                    tabPanel("Criteria",
                             # Criteria_1的问题组
                             conditionalPanel(
                               condition = "input.select == 'Criteria_1'",
                               h3("Question 1", align = "left"),
                               prettyRadioButtons(
                                 inputId = "q1_c1", # 唯一ID区分问题
                                 label = "Predictions:",
                                 choices = c(
                                   "Option 1" = 1,
                                   "Option 2" = 2,
                                   "Option 3" = 3),
                                 inline = TRUE,
                                 status = "danger",
                                 fill = TRUE),
                               h3("Question 2", align = "left"),
                               prettyRadioButtons(
                                 inputId = "q2_c1", # 唯一ID区分问题
                                 label = "Hypotheses:",
                                 choices = c(
                                   "Option 1" = 1,
                                   "Option 2" = 2,
                                   "Option 3" = 3),
                                 inline = TRUE,
                                 status = "danger",
                                 fill = TRUE)
                             ),
                             # Criteria_2的问题组
                             conditionalPanel(
                               condition = "input.select == 'Criteria_2'",
                               h3("Question 1", align = "left"),
                               prettyRadioButtons(
                                 inputId = "q1_c2", # 唯一ID区分问题
                                 label = "Methods:",
                                 choices = c(
                                   "Option 1" = 1,
                                   "Option 2" = 2),
                                 inline = TRUE,
                                 status = "danger",
                                 fill = TRUE),
                               h3("Question 2", align = "left"),
                               prettyRadioButtons(
                                 inputId = "q2_c2", # 唯一ID区分问题
                                 label = "Paradigm:",
                                 choices = c(
                                   "Option 1" = 1,
                                   "Option 2" = 2,
                                   "Option 3" = 3),
                                 inline = TRUE,
                                 status = "danger",
                                 fill = TRUE)
                             )),
                    tabPanel("Summary score",
                             DT::DTOutput("summary_table")) # 先声明输出容器
                  ))
                ))

server <- function(input, output) {
  # 创建响应式存储对象,保存不同criteria的选择值,切换时不丢失
  user_choices <- reactiveValues(
    Criteria_1 = list(Question1 = NULL, Question2 = NULL),
    Criteria_2 = list(Question1 = NULL, Question2 = NULL)
  )
  
  # 监听Criteria_1的问题输入,更新存储值
  observeEvent(input$q1_c1, {
    user_choices$Criteria_1$Question1 <- input$q1_c1
  })
  
  observeEvent(input$q2_c1, {
    user_choices$Criteria_1$Question2 <- input$q2_c1
  })
  
  # 监听Criteria_2的问题输入,更新存储值
  observeEvent(input$q1_c2, {
    user_choices$Criteria_2$Question1 <- input$q1_c2
  })
  
  observeEvent(input$q2_c2, {
    user_choices$Criteria_2$Question2 <- input$q2_c2
  })
  
  # 动态生成汇总表格
  output$summary_table <- DT::renderDT({
    # 整理存储的数据为数据框格式
    summary_data <- data.frame(
      Criteria = rep(c("Criteria_1", "Criteria_2"), each = 2),
      Question = rep(c("Question 1", "Question 2"), 2),
      Selected_Option = c(
        user_choices$Criteria_1$Question1,
        user_choices$Criteria_1$Question2,
        user_choices$Criteria_2$Question1,
        user_choices$Criteria_2$Question2
      )
    )
    
    # 渲染表格,空值替换为"-"优化显示
    datatable(summary_data %>% replace(is.na(.), "-"),
              options = list(pageLength = 4)) %>%
      formatStyle(
        'Selected_Option',
        backgroundColor = styleInterval(2, c('gray', 'yellow', 'orange')) # 可选:根据选项值设置背景色
      )
  })
}

shinyApp(ui, server)

关键部分解释

1. 保留单选按钮选择值

  • 用reactiveValues创建了一个可响应的存储容器user_choices,专门保存每个criteria下的问题选择结果
  • 每个单选按钮的输入变化都会被observeEvent监听,一旦用户做出选择就同步更新存储值,这样切换criteria时之前的选择不会丢失

2. 动态生成表格

  • 在UI里先声明DTOutput容器,然后在server中用renderDT动态生成表格
  • 把user_choices里的存储数据整理成数据框,将空值替换为-让表格更整洁
  • 你可以根据需求调整表格样式,比如示例中添加了根据选项值设置背景色的逻辑,也可以直接去掉这部分

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:51:02