R Shiny中忽略列名删除仅含表头的空矩阵列方法咨询
实现思路
针对你提出的两个需求,核心修改逻辑如下:
- 修正空列删除逻辑:原代码仅执行了空列筛选但未将结果回写至矩阵,导致删除不生效;空列判断本身就是仅校验单元格内容,不受列名影响,修复回写逻辑即可实现自动清理空列。
- 列名自动重排:调整操作顺序,先删除空列,再基于剩余列数重新生成连续的场景序号列名,即可解决删除场景后序号不连续的问题。
修改后完整代码
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
相关产品推荐
相关产品推荐

