R Shiny的observeEvent中使用isTruthy触发matrixInput报错如何解决?
问题根因
你遇到的报错核心来自两个叠加问题:
input$input1是通过renderUI异步渲染的,页面刚加载完成、用户未操作第一个矩阵时,input$input1还未被Shiny注册为有效值,此时点击按钮触发模态框,isTruthy(input$input1)判断返回FALSE,走你写的else分支生成默认矩阵- 你给第二个矩阵
input2开启了multiheader=TRUE(多层表头),但else分支生成的矩阵列名是单层字符向量,不符合多层表头要求的「列名为行数≥2的矩阵」格式,导致matrixInput识别传入的value不是合法格式,抛出is.matrix(value) is not TRUE错误
解决方案
调整模态框中input2的默认值生成逻辑,提前适配多层表头的格式要求,同时规避异步渲染导致的input$input1空值问题:
- 生成默认矩阵时直接设置符合
multiheader=TRUE要求的双层列名 - 优先使用已有的
input$input1/input$input2值,空值 fallback 时直接生成符合格式的默认矩阵,不用依赖未初始化的异步渲染值
修改后的核心代码片段如下,替换你原代码中对应的observeEvent(input$show2nd)部分即可:
observeEvent(input$show2nd,{ # 提前定义符合多层表头要求的默认矩阵,列名为2行矩阵,第一行是场景号,第二行是字段名 default_mat <- matrix(c(input$periods,5), 1, 2, dimnames = list( NULL, rbind("1", c("Period (X)","Y")) )) showModal( modalDialog( matrixInput("input2", label = "Add builder-curves (sequentially numbered):", value = if(isTruthy(input$input2)){ input$input2 } else if(isTruthy(input$input1)){ # 把input1的单层列名转为双层,适配multiheader格式要求 tmp <- input$input1 colnames(tmp) <- rbind("1", colnames(tmp)) tmp } else { default_mat }, rows = list(extend = TRUE, names = FALSE), cols = list(extend = TRUE, delta = 2, delete = TRUE, names = TRUE, editableNames = FALSE, multiheader=TRUE ), class = "numeric"), footer = modalButton("Close") )) })
调整后不管用户有没有操作第一个矩阵,点击按钮都能正常弹出第二个矩阵,默认值和第一个矩阵的初始值完全一致,不会再抛出格式错误。
内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072
相关产品推荐
相关产品推荐

