You need to enable JavaScript to run this app. R中调用andrews()函数时已正确选列却触发undefined columns error的问题
优惠活动
大模型
产品
解决方案
定价
更多

R中调用andrews()函数时已正确选列却触发undefined columns error的问题

andrews包函数调用索引报错

可复现代码

install.packages("andrews")
library(andrews)

x = sample(1:200)
y = sample(1:200)
z = sample(1:200)
a = sample(1:200)

dat = data.frame(x = x, y=y, z=z, a=a)

dat$a[dat$a>100] = "old"
dat$a[as.numeric(dat$a)<=100] = "young"


andrews(dat[,1:3], clr = a)
andrews(dat[1:3,], clr = a)
andrews(dat, clr = a)
andrews(dat[,1:3], clr = "a")
andrews(dat[,1:3], clr = 4)

实际报错表现

运行上述所有andrews()函数时,均触发完全相同的报错:
Error in [.data.frame(df, , clr) : undefined columns selected
已排除基础数据读取故障:直接运行head(dat[,1:3])可正常输出对应三列的内容,不存在数据框列加载异常的问题。

报错根源

andrews()函数的clr参数有固定的取值规则,和日常写R代码的传参习惯存在差异:

  • clr参数仅支持从第一个参数传入的数据集内部匹配列,用来指定分组映射颜色,不支持直接传入全局环境中独立存在的向量作为分组依据。
  • 逐行核对错误调用的问题:
    • 凡是传入dat[,1:3]作为数据集的三个调用,因为数据集只保留了x/y/z三列,不管是按列名还是列位置指定a列作为分组,都会因为数据集中不存在目标列触发索引错误:
      • 裸写clr = a时,函数会在传入的3列数据集里找名为a的列,自然无法定位到目标
      • 写clr = "a"时,按字符串列名匹配,数据集里没有对应列名
      • 写clr = 4时,按列位置索引第4列,数据集总共只有3列,触发位置越界
    • 传入dat[1:3,]和dat的两个调用,虽然数据集本身包含a列,但因为裸写clr = a没有加引号,函数的非标准求值逻辑不会去全局环境匹配独立的a对象,只会把传入的a当作数据框内的列名去索引,最终也会触发匹配错误。

正确调用示例

要实现a列分组的可视化,必须保证分组列完整包含在传入andrews()的数据集内,再指定列名:

# 传入完整数据集,用字符串列名指定分组依据
andrews(dat, clr = "a")
# 传入完整数据集,按列位置指定分组列(a为dat的第4列)
andrews(dat, clr = 4)

内容的提问来源于stack exchange,提问作者Allerleirauh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 11:24:09