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
相关产品推荐
相关产品推荐

