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

R Shiny中忽略列名删除仅含表头的空矩阵列方法咨询

实现思路

针对你提出的两个需求,核心修改逻辑如下:

  1. 修正空列删除逻辑:原代码仅执行了空列筛选但未将结果回写至矩阵,导致删除不生效;空列判断本身就是仅校验单元格内容,不受列名影响,修复回写逻辑即可实现自动清理空列。
  2. 列名自动重排:调整操作顺序,先删除空列,再基于剩余列数重新生成连续的场景序号列名,即可解决删除场景后序号不连续的问题。

修改后完整代码

library(shiny)
library(shinyMatrix)
library(dplyr)
library(ggplot2)

interpol <- function(a, b) { # a = periods, b = matrix inputs
  c <- rep(NA, a)
  c[1] <- b[1]
  c[a] <- b[2]
  c <- approx(seq_along(c)[!is.na(c)], c[!is.na(c)], seq_along(c))$y # << interpolates
  return(c)
}

ui <- fluidPage(
  sliderInput('periods','Periods to interpolate:',min=2,max=10,value=10),
  matrixInput(
    "myMatrixInput",
    label = "Values to interpolate paired under each scenario heading:",
    value =  matrix(c(1, 5), 1, 2, dimnames = list(NULL, c("Scenario 1", "NULL"))),
    cols = list(extend = TRUE,  delta = 2, names = TRUE,  delete = TRUE,  multiheader = TRUE),
    rows = list(extend = FALSE, delta = 1, names = FALSE, delete = FALSE),
    class = "numeric"),
  plotOutput("plot")
)

server <- function(input, output, session) {
  
  sanitizedMat <- reactiveVal()
  
  observeEvent(input$myMatrixInput, {
    tmpMatrix <- input$myMatrixInput
    
    # 校验每列单元格是否全为空/NA,忽略列名
    empty_columns <- sapply(tmpMatrix, function(x) all(is.na(x) | x == ""))
    # 保留非空列,drop=F避免只剩一列时矩阵降维为向量
    tmpMatrix <- tmpMatrix[, !empty_columns, drop = FALSE]
    
    # 删完空列后再重新生成连续的场景列名
    colnames(tmpMatrix) <- paste("Scenario", trunc(1:ncol(tmpMatrix)/2 + 1))
    
    # 更新前端矩阵输入
    updateMatrixInput(session, inputId = "myMatrixInput", value = tmpMatrix)
    # 同步更新清洗后的计算用矩阵
    sanitizedMat(na.omit(tmpMatrix))
  })
  
  plotData <- reactive({
    lapply(seq_len(ncol(sanitizedMat())/2),
           function(i){
             tibble(
               Scenario = colnames(sanitizedMat())[i*2-1],
               X = 1:input$periods,
               Y = interpol(input$periods, sanitizedMat()[1,(i*2-1):(i*2)])
             )
           }) %>% bind_rows()
  })
  
  output$plot <- renderPlot({
    plotData() %>% ggplot() + geom_line(aes(
      x = X,
      y = Y,
      colour = as.factor(Scenario)
    ))
  })

}

shinyApp(ui, server)

核心修改说明

  • 移除了原代码中判断列名是否为空的分支逻辑,每次矩阵变更都统一执行空列清理、重命名、更新的逻辑,避免边界情况遗漏
  • 补充了空列筛选结果的回写赋值,新增drop = FALSE参数避免矩阵降维异常
  • 调整列名生成的时机,放在空列删除之后,保证场景序号和实际场景数量匹配

内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:09:00