使用gratia包draw()绘制GAM时触发数据框尺寸匹配错误
解决GAM绘图时
Ops.data.frame(guide_loc, panel_loc)错误 问题现象
原本可正常运行的gratia包draw()函数,现在绘制广义可加模型(GAM)或其导数时,持续触发如下错误:
Error in Ops.data.frame(guide_loc, panel_loc) :
‘==’ only defined for equally-sized data frames
用户测试代码如下:
拟合GAM并绘图的代码
library(mgcv) library(gratia) gam1 <- mgcv::gam(mpg ~ cyl + s(disp), data = mtcars, method = "REML") draw(gam1) # 直接调用包内函数也触发错误 gratia::draw(gam1)
绘制模型导数的触发代码
derivatives1 <- derivatives(gam1, term = "s(disp)", order = 1L, type = "central", n = 250, eps = 1, interval = "simultaneous", n_sim = 500000, unconditional = TRUE) draw(derivatives1)
用户已尝试重启R、卸载重装包,但问题仍存在。
解决方法
1. 优先更新gratia到最新开发版
这个错误多由gratia与ggplot2的版本不兼容导致(ggplot2内部接口更新后旧版gratia未适配),安装最新开发版可解决大部分此类问题:
# 先安装remotes包(如果没装) if (!requireNamespace("remotes")) install.packages("remotes") remotes::install_github("gavinsimpson/gratia")
2. 更新所有依赖包
同时更新mgcv、ggplot2等核心依赖包,避免版本错位:
update.packages(ask = FALSE)
3. 排除全局环境变量干扰
全局环境中若存在与函数内部变量同名的data.frame(比如guide_loc或panel_loc),会干扰gratia的绘图逻辑,清空环境后重试:
rm(list = ls()) library(mgcv) library(gratia) # 重新拟合模型并绘图 gam1 <- mgcv::gam(mpg ~ cyl + s(disp), data = mtcars, method = "REML") draw(gam1)
4. 检查会话信息定位版本冲突
运行sessionInfo()查看包版本,重点确认:
- gratia版本需≥0.8.1(或开发版)
- ggplot2版本需与gratia兼容(建议用最新稳定版)
- mgcv版本需匹配当前R版本
内容的提问来源于stack exchange,提问作者flâneur
相关产品推荐
相关产品推荐

