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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:45:03