shinySurveys中radioMatrixInput无法获取未完成响应的问题
解决shinySurveys中radioMatrixInput无法获取部分作答数据的问题
radioMatrixInput的默认逻辑是仅当所有问题行都完成选择后,才会将响应数据同步到Shiny的input对象中。要获取用户的部分作答数据,需要绕开这个默认限制,直接从页面DOM中提取选中的值并主动传递给服务器端。
实现方案
- 在UI中嵌入JavaScript代码,监听单选框的点击事件,实时收集已选中的选项
- 在服务器端监听自定义的输入对象,接收实时传递的部分作答数据
完整示例代码
library(shiny) library(shinySurveys) # 定义问卷问题集 questions <- data.frame( question = c("问题1", "问题2", "问题3"), option = I(list(c("选项A", "选项B"), c("选项A", "选项B"), c("选项A", "选项B"))), input_type = "radio", input_id = "matrix_radio", dependence = NA, dependence_value = NA, required = FALSE ) ui <- fluidPage( radioMatrixInput( inputId = "matrix_radio", questions = questions, choices = c("选项A", "选项B") ), verbatimTextOutput("partial_response"), # 自定义JS逻辑:实时收集并传递部分作答数据 tags$script(HTML(" $(document).on('change', '#matrix_radio input[type=radio]', function() { let partialResponses = {}; // 遍历每一行问题,提取已选中的选项 $('#matrix_radio .shiny-survey-question-row').each(function() { let question = $(this).find('.shiny-survey-question-text').text().trim(); let selectedVal = $(this).find('input[type=radio]:checked').val(); if (selectedVal) { partialResponses[question] = selectedVal; } }); // 将数据发送到Shiny服务器 Shiny.setInputValue('partial_matrix_data', partialResponses, {priority: 'event'}); }); ")) ) server <- function(input, output, session) { # 监听自定义输入,实时获取部分作答数据 observe({ req(input$partial_matrix_data) output$partial_response <- renderPrint({ cat("当前已完成的作答:\n") print(input$partial_matrix_data) }) }) } shinyApp(ui, server)
代码说明
- JavaScript部分通过监听单选框的
change事件,遍历radioMatrix的每一行问题,提取已选中的选项值,以问题文本为键、选中值为值构建响应对象 - 使用
Shiny.setInputValue将响应对象主动发送到服务器端,priority: 'event'确保数据实时更新 - 服务器端通过
observe监听自定义的input$partial_matrix_data,即可实时获取用户的部分作答数据,无需等待所有问题完成
内容的提问来源于stack exchange,提问作者cwillig
相关产品推荐
相关产品推荐

