R Shiny中调用interpol()函数报错维度数量不正确该如何解决?
错误原因
长版interpol()函数内部使用了[,1]、[,2]这类二维矩阵列索引语法,默认要求输入参数b为二维矩阵。但你在Shiny服务端调用函数时,传入的第二个参数是input$myMatrixInput[1,1:2]——对二维矩阵按行取索引后会降维成一维向量,此时调用列索引逻辑就会触发维度不匹配的报错。短版函数没有使用矩阵索引语法,直接读取向量的第1、2位元素,因此可以正常运行。
修复方案
你可以任选以下一种方案修改:
方案1:修改调用逻辑(无需调整长版函数)
将服务端plotData响应式变量中的interpol调用代码调整为如下形式,手动把传入的一维向量转成单行二维矩阵:
Y = interpol(input$periods, matrix(input$myMatrixInput[1,1:2], nrow = 1))
方案2:修改长版interpol()函数(兼容不同输入格式)
在长版interpol()函数的开头增加输入格式兼容逻辑,自动将一维输入转成符合要求的单行矩阵,适配当前调用场景的同时不影响后续完整场景的使用:
interpol <- function(a, b) { # [a] = modeled periods, [b] = matrix inputs # 新增兼容逻辑:如果输入b不是二维矩阵,自动转成单行二维矩阵 if(length(dim(b)) < 2) b <- matrix(b, nrow = 1) c <- b c[,1][c[,1] > a] <- a d <- diff(c[,1, drop = FALSE]) d[d <= 0] <- NA d <- c(1,d) c <- cbind(c,d) c <- na.omit(c) c <- c[,-c(3),drop=FALSE] e <- rep(NA, a) e[c[,1]] <- c[,2] e[seq_len(min(c[,1])-1)] <- e[min(c[,1])] if(max(c[,1]) < a){e[seq(max(c[,1]) + 1, a, 1)] <- 0} e <- approx(seq_along(e)[!is.na(e)], e[!is.na(e)], seq_along(e))$y # interpolates return(e) }
两种方案修改后均可正常运行,默认输入c(2,5)时输出结果为前2期值为5、后续周期值为0,符合需求。
内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072
相关产品推荐
相关产品推荐

