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

Shiny应用DT可编辑表格报dimnames维度不匹配错误求助

解决Shiny DT表格编辑时的dimnames长度不匹配错误

你遇到的错误是因为矩阵列名设置方式错误,以及编辑时数据结构不兼容导致的。以下是具体问题和修复方案:

问题根源

  1. 列名赋值错误:你用names(d1$ults[,i])给矩阵的列元素命名,而非给列本身命名,这会导致dimnames混乱。正确的列名设置应该用colnames()。
  2. 列名生成错误:循环里的cbind("X",as.character(i))会生成二维矩阵,导致列名变成向量而非单个字符串,长度不匹配。
  3. 数据结构不兼容:DT的editData对数据框的支持更稳定,直接用矩阵编辑容易引发维度错误。

修复步骤

  1. 将生成的矩阵转换为数据框,避免矩阵的dimnames问题。
  2. 使用colnames()统一设置列名,循环中用paste0()生成正确的列名字符串。
  3. 确保编辑后的数据保持数据框结构。

修正后的完整代码

library(shiny)
library(DT)
library(bslib) # 补充bs_theme依赖的包

dt_output = function(title, id, button_id) {
  fluidRow(
    column(
      12, 
      h1(title),
      hr(), 
      DTOutput(id),
      actionButton(button_id, "Delete data")
    )
  )
}

render_dt = function(data, editable = 'cell', server = TRUE, ...) {
  renderDT(data, selection = 'none', server = server, editable = editable, ...)
}

generate_normal_data <- function(n, mi, sigma, LI, LS) {
  # 生成示例正态分布数据,替换你实际的计算逻辑
  result_matrix <- matrix(rnorm(100*(n+2), mean = mi, sd = sigma), nrow = 100, ncol = n + 2)
  # 转换为数据框避免矩阵维度名问题
  result_df <- as.data.frame(result_matrix)
  return(result_df)
}

ui <- fluidPage(
  theme = bs_theme(version = 4, bootswatch = "sandstone"),
  titlePanel("Simulador B-ATTRIVAR SS S2"),
  
  sidebarLayout(
    sidebarPanel(
      numericInput("n", "n", value = 2), # 设置默认值方便测试
      numericInput("mi","mi", value = 0),
      numericInput("sigma","sigma", value = 1),
      numericInput("S2p","S2p", value = 1),
      numericInput("alpha","alpha", value = 0.05),
      numericInput("lambda","lambda", value = 1),
      numericInput("beta","beta", value = 0.2),
      actionButton("runButton", "Execute")
    ),
    
    mainPanel(
      tabsetPanel(
        tabPanel("Results and Chart",
                 tableOutput("results"),
                 plotOutput("chart")),
        tabPanel("Insert data", 
                 dt_output('Double-click to edit table cells', 'x1', 'deleteButton'),
                 actionButton("plotDataButton", "Plot Data")),
      )
    )
  )
)

server <- function(input, output) {
  
  d1 <- reactiveValues(ults = NULL)
  res <- reactiveValues(ults = c(NA,NA,NA,NA,NA, 1, 2)) # 设置默认值避免req报错,替换你实际的计算逻辑
  
  observe({
    req(input$n, res$ults)
    d1$ults <- generate_normal_data(input$n, input$mi, input$sigma, res$ults[[6]], res$ults[[7]])
    
    # 正确设置列名
    colnames(d1$ults) <- c(
      "Yd",
      paste0("X", 1:input$n), # 简洁生成X1,X2...Xn列名
      "S2"
    )
  })
  
  # 表格编辑逻辑
  observeEvent(input$x1_cell_edit, {
    d1$ults <- editData(d1$ults, input$x1_cell_edit, 'x1')
  })
  
  output$x1 = render_dt(
    req(d1$ults), 
    list(target = 'cell', disable = list(columns = ncol(d1$ults))) # 动态禁用最后一列(S2)编辑
  )
  
}

shinyApp(ui, server)

关键修改点说明

  • 将generate_normal_data的返回值从矩阵改为数据框,彻底避免矩阵维度名的兼容性问题。
  • 用colnames()一次性设置所有列名,替换原循环中的错误赋值方式,代码更简洁。
  • 编辑逻辑中去掉<<-,d1是reactiveValues对象,直接赋值即可。
  • 禁用最后一列编辑时,用ncol(d1$ults)动态获取列数,避免依赖input$n的延迟问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:00:25