如何用 officer 的 body_add_plot 插入 recordPlot 图形?
数据小陈
结论
body_add_plot() 接收由 plot_instr() 生成的绘图指令对象,不能直接把 recordPlot() 返回的 p2 作为 value 传入。可以在 plot_instr() 的代码中调用 replayPlot(p2),让记录的图形在 body_add_plot() 生成图片时重绘。
题目中的 p2 是先运行 plot(1:10),再调用 recordPlot() 得到的记录对象。用法如下:
library(officer)
plot(1:10)
p2 <- recordPlot()
doc <- read_docx()
p <- plot_instr(code = replayPlot(p2))
doc <- body_add_plot(doc, value = p, style = "centered")
print(doc, target = tempfile(fileext = ".docx"))
plot_instr() 将绘图指令包装起来,body_add_plot() 再按指定的尺寸和分辨率执行指令,并将图形加入 Word 文档。replayPlot(p2) 会把记录的图形重绘到当前图形设备上,这里的设备由 body_add_plot() 的绘图过程提供。officer 的 plot_instr 文档;body_add_plot 文档
使用时留意
- 执行
body_add_plot()中的绘图指令时,p2必须仍然可访问。如果稍后才使用保存的p,请确保p2仍在它所引用的环境中。 - 如果图形是在其他环境或设备条件下记录的,重放结果可能受绘图代码依赖项影响。遇到这种情况,可以回到原始绘图代码,在
plot_instr()中直接重绘。 - 直接传入
p2和将replayPlot(p2)作为绘图指令传入是两种不同做法。body_add_plot()的value应为plot_instr()对象。
备注:内容仅供参考。
