R中Shiny矩阵设为垂直拓展时报logical subscript too long错误原因
错误原因分析
核心错误出现在空列检测的逻辑中:
- Code 1中矩阵的行不允许拓展,永远只有1行,使用
sapply(tmpMatrix, function(x) all(is.na(x) | x == ""))检测空列时,sapply遍历矩阵的每一个元素,得到的逻辑向量长度刚好等于列数,和列索引的长度匹配,因此可以正常执行。 - Code 2放开了行拓展限制,当矩阵的行数大于1时,sapply作用于矩阵会遍历所有元素,得到的逻辑向量长度是
行数×列数,远大于列数。此时用这个超长的逻辑向量作为列筛选条件tmpMatrix[, !empty_columns, drop=FALSE],就会触发逻辑下标太长的报错。
修复方案
将空列检测代码改为按列遍历即可,修改对应代码段为:
# 原错误代码:empty_columns <- sapply(tmpMatrix, function(x) all(is.na(x) | x == "")) # 替换为以下代码 empty_columns <- sapply(seq_len(ncol(tmpMatrix)), function(col_idx) { all(is.na(tmpMatrix[, col_idx]) | tmpMatrix[, col_idx] == "") })
另外存在一个潜在问题:sanitizedMat(na.omit(input$myMatrixInput))会删除所有含NA的行,如果用户新增的行还没填值就会被直接删掉,若所有行都被删除会导致后续计算报错,可根据业务需求调整NA值的处理逻辑。
内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072
相关产品推荐
相关产品推荐

