对于我的cowplot包中的各种函数,我需要能够通过ggplotGrob()函数将ggplot2图转换为grob.在这种情况下的一个已知问题是ggplotGrob()需要一个开放的图形设备,并且根据当前打开的图形设备,对该函数的调用会产生虚假的空图.有关此问题的示例,请参阅
ggplot2 issue #809或最近的
cowplot issue #82.
可以通过打开null pdf设备来解决问题.请参阅以下示例:
library(ggplot2)
# make a plot
p <- qplot(1:10, 1:10)
pdf(NULL) # open NULL pdf device to absorb empty page
grob <- ggplotGrob(p) # convert plot
dev.off()
现在这里是我的问题:序列是pdf(NULL); ggplotGrob(…); dev.off()可以安全地在R包中使用,还是在某种情况下我不能认为pdf(NULL)会成功/可能?如果存在这样的场景,是否存在我可以假设存在的其他图形设备,并且我可以在我处于pdf(NULL)不是一个好主意的情况下进行测试吗?或者,什么是使代码能够容忍pdf(NULL)调用潜在失败的最佳方法?
更新:另请参阅this SO post,其中讨论了空白页面的问题,但没有详细介绍可以解决该问题的安全方法.
更新2:This comment声明某些R安装没有正常运行的pdf().所以似乎并不总是可以打开一个pdf NULL设备.那么问题是:我如何解决这个问题?
最佳答案 当你第一次发布它时,我简要地研究了这个.由于“pdf”不在capability()中,它“应该”始终有效.或者希望如此.我尝试构建一个没有X11访问的计数器示例 – 因此没有字体指标—但失败了.
现在,我仍然看到两个应该总能帮助你的解决方法:
>在R调用中使用虚拟帧缓冲设备;这就是我们如何运行反向检查“无头”.电话会变成this set of lines:
xvfb-run-safe –server-args =“ – screen 0 1024x768x24”R CMD …… whatyouneed ……
>只要对pdf()说“不”并使用cairo()代替a)已知无头工作和b)由两个不同的包提供.