R运行代码及knit Rmd报zero-length variable name错误求解
R报错「Error: attempt to use zero-length variable name」修复方案
该报错会在运行对应R代码、knit RMarkdown文件时同步触发,核心原因是代码存在语法错误导致R解析时识别到空变量名,具体错误点和修复方式如下:
错误点1:dplyr::filter筛选逻辑不完整
filter函数中&逻辑运算符后直接写列名loudness,未补充完整判断条件,会导致解析规则为空触发报错。
- 若不需要对loudness做筛选,直接删除冗余条件;若需要筛选loudness非空值,补全
!is.na()判断即可:
# 无loudness筛选规则的写法 XXXTENTACION <- filter(Spotify, track_artist == "XXXTENTACION") SuicideBoys <- filter(Spotify, track_artist == "$uicideBoy$") # 筛选loudness非空的写法 # XXXTENTACION <- filter(Spotify, track_artist == "XXXTENTACION" & !is.na(loudness)) # SuicideBoys <- filter(Spotify, track_artist == "$uicideBoy$" & !is.na(loudness))
后续t.test代码逻辑无语法问题,筛选修复后可正常运行。
错误点2:lm模型公式语法不规范
在lm公式中使用$直接从全局环境提取向量,同时又指定data参数,会导致模型变量作用域混乱,Rmd编织时很容易触发变量解析错误;同时配套的ggplot使用全量Spotify数据而非目标歌手子集,会导致结果和研究对象不匹配。
- 修复方式:提前筛选目标歌手的分析子集,建模和绘图统一使用该子集,公式内不要用
$取子集:
# 提前构造分析子集,过滤缺失值 xxx_analysis <- filter(Spotify, track_artist == "XXXTENTACION", !is.na(track_popularity), !is.na(loudness)) lm.out <- lm(track_popularity ~ log(loudness), data=xxx_analysis, na.action=na.exclude) summary(lm.out) # 绘图使用分析子集,而非全量数据集 ggplot(data = xxx_analysis, aes(y=track_popularity, x=loudness)) + geom_point() + geom_smooth(method = "lm", se=FALSE) + xlab("Loudness") + ylab("Track Popularity") + labs(title="Popularity vs Loudness of XXXTENTACION")
错误点3:base R绘图错误使用ggplot语法
base R的plot()和abline()是独立运行的命令,不支持用+连接,强行用+拼接会让R尝试从不存在的绘图对象中提取变量,触发零长度变量名报错。
- 修复方式:删除
plot()行尾的+,abline()单独成行运行:
par(mfrow=c(1,2)) plot(fitted(lm.out), residuals(lm.out), xlab="Fitted Values", ylab="Residuals") abline(h=0) hist(residuals(lm.out), xlab="Residuals", main="")
错误点4:统计函数和模型公式逻辑错误
summary()函数一次仅支持传入一个待统计的向量/模型对象,同时传入两个向量会触发参数解析错误lm(loudness ~ loudness)属于变量自身预测自身的无意义自回归公式,会导致模型拟合结果无效
- 修复方式:分别计算两组数据的汇总统计,根据分析目标修正模型公式:
# 分别计算两组数据的描述统计 summary(XXXTENTACION$track_popularity) summary(SuicideBoys$track_popularity) # 输出置信区间 t.test(XXXTENTACION$track_popularity, SuicideBoys$track_popularity, conf.level = 0.99)$conf.int # 修正模型公式(示例为用loudness预测track_popularity,可根据实际研究目标调整因变量) lm2.out <- lm(track_popularity ~ loudness, data=xxx_analysis) new.loudness <- data.frame(loudness = c(0.925)) (CI.energy <- predict(lm2.out, newdata = new.loudness, interval = "confidence", level = 0.95)) (PI.energy <- predict(lm2.out, newdata = new.loudness, interval = "prediction", level = 0.95))
内容的提问来源于stack exchange,提问作者Courtney Bawden
相关产品推荐
相关产品推荐

