R中函数内调用cowplot::plot_grid导出PNG失败怎么解决?
问题解决方法
问题原因
- R存在自动打印规则限制:在顶层脚本/交互式环境直接运行
cowplot::plot_grid(g)时,R会自动打印该函数返回的ggplot类对象,绘图内容会被写入已打开的png设备。 - 但在自定义函数内部,表达式的返回值默认不会被自动打印,你调用
cowplot::plot_grid(ggobject)生成了绘图对象,但没有输出到激活的图形设备,相当于打开设备后没有写入任何内容就直接关闭,因此不会生成有效png文件。 - 你看到的
null device 1这类返回是dev.off()的正常输出,和绘图是否成功写入无关。
解决方法
修改自定义函数,显式打印cowplot::plot_grid()返回的绘图对象即可,修正后的代码如下:
pxPrint <- function(ggobject, fn, x = 1000, y = 1000) { grDevices::png(filename = fn, width = x, height = y, units = "px", bg = "transparent") # 显式打印绘图对象,才能将内容写入图形设备 print(cowplot::plot_grid(ggobject)) grDevices::dev.off() } # 调用即可正常生成mypic2.png pxPrint(ggobject = g, fn = "mypic2.png")
补充说明
该规则对所有ggplot2系列的绘图对象都生效,如果你在函数内直接用ggplot()绘图不调用print,也会出现同样的无输出问题。
内容的提问来源于stack exchange,提问作者Timm S.
相关产品推荐
相关产品推荐

