【问题标题】:Redirect all plot output to specific file将所有绘图输出重定向到特定文件
【发布时间】:2013-07-11 04:56:09
【问题描述】:

我想自动将所有绘图重定向到文件(原因:见下文)。有没有一种简单的方法可以做到这一点?

没有这个,我其实并不害怕重写内置函数,我那个绝望了。我能想到的最简单的方法是连接到基本的绘图窗口创建函数并调用pdf(…),然后连接到绘图完成函数并在那里调用dev.off()

但是这些功能是什么?通过调试,我初步确定了dev.holddev.flush——但这真的普遍存在吗?我可以挂钩这些功能吗?我不能用R.utils'reassignInNamespace 覆盖它们,因为它们已被锁定,并且仅将同名函数放入全局命名空间是行不通的(plot 会忽略它们)。


那么,为什么我会想做这么可怕的事情?

因为我在远程服务器上工作,尽管我尽了最大努力,并且与我们的系统支持进行了长时间的调试会话,但我无法让 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 调用以尽可能简化它。

有机会吗?

【问题讨论】:

  • 我以前也遇到过这个问题,我试过 X11 转发,它又慢又笨重。我也尝试使用您的模式将我的所有文件都放到 pdf 中。但后来我切换到 RStudio Server,所有这些问题都消失了。我可以在本地快速预览在服务器上计算的绘图。只是一个建议。
  • 好吧,我一定是误读了一些东西。键入 preview(plot(x[1:35],y[31:65],t='l',col=rainbow(40),xlab="wtf", ylab='fubar',main='this is a lot of typing') 比仅键入 plot 字符串花费的时间要长得多?有些地方不对劲,其中最重要的是:如果你有合作者,那么你是在做开发工作,而不是演示,对吧?因此,他们几乎不应该在几秒钟内不耐烦地看到正在编写和绘制的新算法。那么到底发生了什么?
  • 为什么不Plot &lt;- function(...) {on.exit(dev.off()); pdf(file="foo.pdf"); plot(...)}
  • @Carl 错误的公式。两个原因。首先,如前所述,瓶颈。这并不是说输入preview() 需要很多时间,但是如果您正在开会,并且想尝试以新的方式绘制数据,请在控制台中输入停止对话。这很尴尬和烦人。所以你打字很快。并犯错误。而且需要更长的时间。它变得更加烦人。这不仅限于我,顺便说一句,我在其他人身上也看到了这一点。结果:无害的小preview()是有害的。
  • 如果打字会阻碍对话,任何其他创建情节的方法也会如此。也许您需要移动到 TclTK gui,其中包含用于缩放的滑块、用于线条和点的按钮、用于数据源的下拉菜单。我不相信你的问题就是你认为的那样,重新组织会议协议会更有成效。

标签: r plot output-redirect


【解决方案1】:

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

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

如果您永远不会添加到情节中,那么您可以使用addTaskCallback 自动为您调用dev.off。您可能还可以使用其他挂钩来完成。

【讨论】:

  • 特别是options(device="pdf")。正如格雷格所说,你必须做dev.off()(或它的一些更短的别名)来完成绘图,但这似乎比期望 R 知道你何时完成向绘图添加图层要好(points()lines()legend()等)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 2019-09-23
相关资源
最近更新 更多