如何在RStudio的两个连续代码块中拼接绘制图形?
解决R Notebook多代码块拼接绘图的问题
问题核心:knit时每个代码块会独立启动并关闭绘图设备,第二个代码块无法访问第一个代码块创建的绘图上下文,导致plot.new has not been called yet错误。
解决方案:记录并恢复绘图状态
在第一个代码块中记录绘图状态,第二个代码块恢复后再添加图层:
第一个代码块(创建空画布并记录)
plot(y = 1:61, x = 1:87, type = "n") # 记录当前绘图状态 plt_record <- recordPlot()
intermission
第二个代码块(恢复绘图并添加等高线)
# 恢复之前记录的绘图 replayPlot(plt_record) # 添加等高线 contour(y = 1:61, x = 1:87, z = volcano, add = TRUE)
原理说明
recordPlot()会把当前绘图设备的内容保存为一个对象,replayPlot()则会将这个对象重新绘制到当前绘图设备中,这样第二个代码块就能基于第一个代码块的画布继续绘图,完美适配knit时的代码块独立执行逻辑。
另外,RStudio交互式运行时将代码块输出类型设为控制台也能正常运行,但该设置仅影响交互式环境,对knit无效,所以上述方法是通用的解决方案。
内容的提问来源于stack exchange,提问作者Gimelist
相关产品推荐
相关产品推荐

