将所有绘图输出重定向到特定文件

时间:2013-07-12 15:26:43

标签: r plot output-redirect

我想自动将所有绘图重定向到文件(原因:见下文)。是否有一种非黑客的方式来实现这一目标?

缺乏这一点,我实际上并不害怕覆盖内置函数,我 绝望。我能想到的最简单的方法是挂钩基本的绘图窗口创建函数并调用pdf(…),然后挂钩到plot-finalizing函数并在那里调用dev.off()

但这些功能是什么?通过调试,我暂时确定了dev.holddev.flush - 但这实际上是否真的普遍存在?我可以挂钩这些功能吗?我无法使用R.utils'reassignInNamespace覆盖它们,因为它们已被锁定,只是将同名函数放入全局命名空间不起作用(它们被plot忽略)。 / p>


那么,为什么我想做一些如此可怕的事情?

因为我正在使用远程服务器,尽管我有最好的尝试,并且在我们的系统支持下进行了长时间的调试,但我无法让X11转发工作可靠。无法预览情节会使我的工作流程非常低效。我已经放弃尝试让X11工作,所以现在我在我的public_html文件夹中创建PDF并刷新浏览器。

这非常有效 - 除了用pdf(…) … dev.off()总是围绕你的绘图函数调用真的很烦人且非常耗时,特别是在你想要快速创建绘图的交互式会话中与合作者会面。事实上,它真的很烦人,他们(可以理解)没有耐心等待。

现在我正在帮助自己完成以下功能定义:

preview <- function (.expr, ...) {
    on.exit(dev.off())
    pdf(PREVIEW_FILE_NAME, ...)
    eval(substitute(.expr))
}

使用方法如下:

preview(plot(1:100, rnorm(100) * 1:100))

一切正常。但这个工作流程在会议中是一个真正的瓶颈,我想摆脱preview调用以尽可能简化它。

有机会吗?

1 个答案:

答案 0 :(得分:4)

如果设置options(device=FUN),那么图形设备功能FUN将成为新的默认图形设备,在创建绘图并且设备尚未打开时将打开该设备。

因此,一个选项是编写一个调用pdfpng或其他图形设备的函数,其中包含您想要的文件名和选项(可能onefile=FALSE pdf }),然后将此函数设置为选项中的默认值。您可能需要使用dev.offplot.newframe中的一个来完成当前的绘图(在您关闭设备或转到新的绘图之前,R不会最终确定向当前情节添加任何内容。)

如果您永远不会添加到情节中,那么您可以使用addTaskCallback自动为您调用dev.off。可能还有其他钩子可用于最终确定。