PAYATHON 2026

如何用 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() 对象。

备注:内容仅供参考。