R shinydashboard基于sliderInput生成可变行数可编辑表格实现咨询
R shinydashboard动态可编辑表格实现方案
以下为完整可运行代码,覆盖你需要的所有功能:
library(shiny) library(DT) library(dplyr) library(shinydashboard) ui <- dashboardPage( dashboardHeader(title = "Interview Reliability"), dashboardSidebar( sidebarMenu( menuItem("Two Interviewers", tabName = "2int", icon = icon("glass-whiskey")), menuItem("Three Interviewers", tabName = "3int", icon = icon("glass-whiskey")), menuItem("Four Interviewers", tabName = "4int", icon = icon("glass-whiskey")) ) ), dashboardBody( tabItems( tabItem(tabName = "2int", fluidRow( box(sliderInput("obs1", "Number of Interview Questions:", value = 4, min = 4, max = 12, step = 1)), box(actionButton("sub", "Submit Number of Interview Questions", icon("refresh"), style="color: #fff; background-color: #337ab7; border-color: #2e6da4")), box(actionButton("save_data", "Save Rating Data", icon("save"), style="color: #fff; background-color: #28a745; border-color: #1e7e34")) ), box(DTOutput("table1"), width = 12), # 可选:展示已保存的数据用于验证 box(verbatimTextOutput("saved_preview"), title = "已保存数据预览", width = 12) ), tabItem(tabName = "3int", box(sliderInput("obs2", "Number of Interview Questions:", value = 4, min = 4, max = 12, step = 1)) ), tabItem(tabName = "4int", box(sliderInput("obs3", "Number of Interview Questions:", value = 4, min = 4, max = 12, step = 1)), ) ) ) ) server <- function(input, output) { # 初始化响应式存储,空表初始为4行(和slider默认值一致) tableValues <- reactiveValues( df = matrix(NA, nrow = 4, ncol = 2, dimnames = list(1:4, c("Interviewer 1", "Interviewer 2"))), saved_data = NULL ) # 监听提交行数按钮,动态生成对应行数的空表 observeEvent(input$sub, { req(input$obs1) row_num <- input$obs1 tableValues$df <- matrix(NA, nrow = row_num, ncol = 2, dimnames = list(1:row_num, c("Interviewer 1", "Interviewer 2"))) }) # 渲染可编辑表格 output$table1 <- renderDT({ req(tableValues$df) datatable( tableValues$df, editable = list(target = "cell", disable = list(columns = c(0))), # 仅允许编辑单元格,禁止修改行名 options = list(dom = 't', ordering = F, pageLength = 12) # 隐藏搜索、分页等不需要的组件 ) }) # 监听单元格编辑事件,限制输入为1-5的整数 observeEvent(input$table1_cell_edit, { edit_info <- input$table1_cell_edit row <- edit_info$row col <- edit_info$col val <- edit_info$value # 校验输入值 if(!grepl("^[1-5]$", val)){ # 不符合规则重置为NA并提示 tableValues$df[row, col] <- NA showNotification("仅允许输入1-5之间的整数", type = "error", duration = 3) }else{ # 符合规则更新存储的表格数据 tableValues$df[row, col] <- as.integer(val) } }) # 监听保存按钮,存储最终数据供后续使用 observeEvent(input$save_data, { # 检查是否有未填写的单元格,可根据需求移除该校验 if(any(is.na(tableValues$df))){ showNotification("存在未填写的评分,请补全后再保存", type = "warning", duration = 3) return() } tableValues$saved_data <- as.data.frame(tableValues$df) showNotification("数据保存成功,可通过tableValues$saved_data调用", type = "message", duration = 3) }) # 可选:预览已保存的数据 output$saved_preview <- renderPrint({ req(tableValues$saved_data) tableValues$saved_data }) } shinyApp(ui = ui, server = server)
功能说明
- 动态表格生成:解决了初始代码中响应式上下文的报错问题,点击「提交问题数量」按钮后会根据slider当前取值生成对应行数的空评分表
- 输入限制:所有单元格仅支持输入1-5的整数,不符合规则的输入会自动重置并弹出错误提示
- 数据保存:点击「保存评分数据」按钮后,表格数据会以数据框格式存入
tableValues$saved_data,后续所有计算逻辑可直接调用该对象 - 额外新增了已保存数据预览区域,可直接验证保存结果,不需要可直接删除对应代码
内容的提问来源于stack exchange,提问作者Sam_Donnelly
相关产品推荐
相关产品推荐

