Rmarkdown执行knit编译报错:for循环调用curve绘图提示plot.new未调用
问题修复方案
错误原因
报错核心是第二个代码块中curve()函数设置了add = TRUE参数,该参数要求在已存在的激活画布上叠加绘图。你将两段代码拆分为独立代码块后,第一个代码块仅定义了函数未生成绘图设备,运行第二个代码块时无可用画布,因此触发plot.new has not been called yet错误。
修复方法
方法1:保留多曲线叠加的单张图表效果
在for循环前先初始化空白画布,设置匹配的坐标范围即可,第二个代码块修改为:
# 初始化空白画布,仅绘制坐标轴 plot(x = c(-5,5), y = c(0,1), type = "n", xlab = "x", ylab = "sigmoid值") for (b in c(1:5)){ curve(expr = lg(x, 1, b), from = -5, to = 5, n = 100, add= TRUE, col = b) }
说明:type = "n"参数表示仅生成画布和坐标轴,不绘制任何图形元素,完美适配后续叠加曲线的需求。
方法2:生成单条曲线独立的多张图表
去掉curve()中的add = TRUE参数即可,每次调用curve()会自动新建画布生成单独图表,第二个代码块修改为:
for (b in c(1:5)){ curve(expr = lg(x, 1, b), from = -5, to = 5, n = 100, col = b) }
说明:如果编译后仅输出最后一张图,可在curve()外层包裹print()函数强制输出所有循环内生成的图表,即print(curve(...))。
注意事项
确保两个代码块的执行环境连贯,不要为第一个代码块设置cache = FALSE之外的缓存参数,避免第二个代码块无法调用到已定义的lg函数。
内容的提问来源于stack exchange,提问作者Alison Meeth
相关产品推荐
相关产品推荐

