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
相关产品推荐
相关产品推荐

