【问题标题】:Can I assume that it is always possible to open a pdf NULL device in R?我可以假设总是可以在 R 中打开一个 pdf NULL 设备吗?
【发布时间】:2017-11-30 19:04:12
【问题描述】:

对于我的 cowplot 包中的各种函数,我需要能够通过 ggplotGrob() 函数将 ggplot2 图转换为 grobs。这种情况下的一个已知问题是ggplotGrob() 需要一个打开的图形设备,并且根据当前打开的图形设备,对该函数的调用会创建一个虚假的空图。有关此问题的示例,请参阅 ggplot2 issue #809 或最近的 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()

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

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

更新 2:This comment 指出某些 R 安装没有正常工作的pdf()。因此,似乎确实并不总是可以打开 pdf NULL 设备。那么问题是:我该如何解决这个问题?

【问题讨论】:

  • 谢谢@baptiste!我假设您在 egg 库中遇到了类似的问题。你做什么工作?使用pdf(NULL) 并希望获得最好的结果?
  • 老实说,我已经放弃了这个问题,就像许多其他被关闭或解雇的人一样。这听起来像是一个合理的解决方法。

标签: r ggplot2 r-grid


【解决方案1】:

当你第一次发布它时,我简要地研究了它。由于“pdf”不在capabilities() 中,它“应该”总是有效。或者如此希望。我尝试构建一个没有 X11 访问权限的反例——因此没有字体度量——但失败了。

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

  1. 在你的 R 调用中使用虚拟帧缓冲设备;这就是例如我们如何运行反向依赖于“无头”检查。电话变成了this set of lines:

    xvfb-run-safe --server-args="-screen 0 1024x768x24" R CMD ...whatyouneed...

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

【讨论】:

  • 德克,感谢您的回答。您是否看到 this comment, 指出某些 R 安装没有正常运行的 pdf()?我认为cairo() 解决方案是行不通的,因为它为我的包创建了额外的依赖项。
  • 我真的不知道。当然,当人们对他们的系统做最糟糕的事情时,会有一些 R 安装出现问题或其他问题。问题是:这是系统的吗?你的单元测试会中断吗?它会在 CRAN 上失败吗?而且我不这么认为,但也许我有偏见和被宠坏了,因为我们建立的系统是健全和有效的......
猜你喜欢
  • 2015-05-05
  • 1970-01-01
  • 2016-06-21
  • 2016-04-22
  • 2013-10-15
  • 2018-07-17
  • 1970-01-01
  • 2015-02-06
  • 2022-09-30
相关资源
最近更新 更多