加载DescTools/e1071包后,查看含dist对象的列表报错如何解决?
问题:加载e1071/DescTools包后,使用View()查看含dist对象的列表报错
正常操作场景
无额外包加载时,以下代码可正常执行:
A <- data.frame(x = c(1:10), y = c(21:30)) B <- dist(A) C <- list(B) View(C)
加载包后的错误场景
加载e1071或DescTools包后,执行相同代码会触发维度错误:
library("e1071") A <- data.frame(x = c(1:10), y = c(21:30)) B <- dist(A) C <- list(B) View(C)
Error in .Primitive("[")(x, 1:6, , drop = FALSE) :
incorrect number of dimensions
例外情况
直接调用列表或列表中的距离矩阵时,无报错且输出正常:
C[[1]] # 输出: 1 2 3 4 5 6 7 8 9 2 1.414214 3 2.828427 1.414214 4 4.242641 2.828427 1.414214 5 5.656854 4.242641 2.828427 1.414214 6 7.071068 5.656854 4.242641 2.828427 1.414214 7 8.485281 7.071068 5.656854 4.242641 2.828427 1.414214 8 9.899495 8.485281 7.071068 5.656854 4.242641 2.828427 1.414214 9 11.313708 9.899495 8.485281 7.071068 5.656854 4.242641 2.828427 1.414214 10 12.727922 11.313708 9.899495 8.485281 7.071068 5.656854 4.242641 2.828427 1.414214
问题根源
e1071和DescTools包重载了部分基础操作符(如[),或是修改了dist对象的类属性,导致View()函数在解析列表中的dist对象时,错误地尝试用多维数组的方式访问一维的dist紧凑存储结构,触发维度错误。即使使用detach()卸载包,已修改的环境方法绑定不会自动恢复,必须重启会话才能重置。
解决方案
方案1:避免加载整个包,直接调用目标函数
如果仅需要e1071的峰度、偏度函数,无需加载整个包,直接通过命名空间调用:
# 计算峰度 e1071::kurtosis(A$x) # 计算偏度 e1071::skewness(A$y)
这样既不会触发包冲突,也能完成需求。
方案2:将dist对象转为矩阵后存入列表
dist是一维的紧凑存储格式,转为矩阵后View()可正常解析:
library("e1071") A <- data.frame(x = c(1:10), y = c(21:30)) # 将dist转为矩阵格式 B <- as.matrix(dist(A)) C <- list(B) View(C)
方案3:明确调用utils包的View函数
部分包可能重载了View()方法,直接指定基础包的View函数可绕过冲突:
utils::View(C)
内容的提问来源于stack exchange,提问作者bkl
相关产品推荐
相关产品推荐

