我的R nls模型plot代码运行正常,knit时失败是什么原因?
问题根因
- R默认的stats基础包未提供
nls模型对象对应的plot()S3方法,你本地交互环境可正常运行,是因为你之前已经加载了带plot.nls方法的第三方扩展包(例如nlstools、car等常用统计扩展包都内置了该方法),但你没有在R Markdown的代码块中显式声明加载对应包。 - Knit操作会启动独立的全新R会话,不会继承你本地交互环境已加载的包,此时调用
plot(lmod)会触发默认的plot.default()方法,将nls模型对象作为普通列表解析,无法找到绘图所需的x、y字段,就会抛出你看到的错误。
解决方案
你可以根据自己的需求任选一种方案修复:
- 方案1:在R Markdown的代码块开头显式加载你交互环境中使用的对应扩展包,例如使用
nlstools的话添加一行:
library(nlstools)
- 方案2:不依赖第三方包的隐式绘图方法,手动编写绘图代码:
# 绘制原始散点 plot(Mass ~ Age, data = dinodat, main = "年龄与体重拟合关系") # 生成拟合线数据 pred_dat <- data.frame(Age = seq(min(dinodat$Age), max(dinodat$Age), length.out = 100)) pred_dat$fit_mass <- predict(lmod, newdata = pred_dat) # 添加拟合线 lines(fit_mass ~ Age, data = pred_dat, col = "red", lwd = 2)
- 方案3:如果不需要输出
nls的拟合诊断图,直接删除plot(lmod)这行代码即可,不会影响模型参数计算和置信区间输出。
内容的提问来源于stack exchange,提问作者Alison Meeth
相关产品推荐
相关产品推荐

