我可以假设总是可以在 R 中打开 pdf NULL 设备吗?

Can I assume that it is always possible to open a pdf NULL device in R?

对于我的 cowplot 包中的各种函数,我需要能够通过 ggplotGrob() 函数将 ggplot2 图转换为 grob。此上下文中的一个已知问题是 ggplotGrob() 需要一个打开的图形设备,并且根据当前打开的图形设备,对此函数的调用会创建一个虚假的空图。有关此问题的示例,请参阅 ggplot2 issue #809 or most recently cowplot issue #82.

可以通过打开空 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()

现在我的问题是:在 R 包中使用序列 pdf(NULL); ggplotGrob(...); dev.off() 是否安全,或者在某些情况下我不能假设 pdf(NULL) 将是 successful/possible?如果存在这种情况,是否还有其他我可以假设存在的图形设备,我可以在 pdf(NULL) 不是一个好主意的情况下进行测试吗?或者,使代码能够容忍 pdf(NULL) 调用的潜在失败的最佳方法是什么?

更新:另请参阅 this SO post,其中讨论了空白页的问题,但没有详细说明可以使用哪些安全方法来解决该问题。

更新 2:This comment 声明某些 R 安装没有正常运行 pdf()。所以看起来确实不能一直打开pdf NULL设备。接下来的问题是:我该如何解决这个问题?

当你第一次发布它时,我简单地调查了一下。由于 "pdf" 不在 capabilities() 中,它 "should" 始终有效。或者有人希望如此。我尝试构建一个没有 X11 访问权的反例——因此没有字体规格——但失败了。

现在,我仍然看到两个应该总是对您有帮助的解决方法:

  1. 在你的 R 调用中使用虚拟帧缓冲设备;这就是我们如何 运行 反向依赖检查 "head-less"。调用变成类似 this set of lines:

    xvfb-运行-safe --server-args="-screen 0 1024x768x24" R CMD ...你需要什么...

  2. pdf()说不,改用cairo(),这是a)已知的无头工作和b)由两个不同的包提供。