【发布时间】:2013-07-11 04:56:09
【问题描述】:
我想自动将所有绘图重定向到文件(原因:见下文)。有没有一种简单的方法可以做到这一点?
没有这个,我其实并不害怕重写内置函数,我那个绝望了。我能想到的最简单的方法是连接到基本的绘图窗口创建函数并调用pdf(…),然后连接到绘图完成函数并在那里调用dev.off()。
但是这些功能是什么?通过调试,我初步确定了dev.hold 和dev.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 <- function(...) {on.exit(dev.off()); pdf(file="foo.pdf"); plot(...)}? -
@Carl 错误的公式。两个原因。首先,如前所述,瓶颈。这并不是说输入
preview()需要很多时间,但是如果您正在开会,并且想尝试以新的方式绘制数据,请在控制台中输入停止对话。这很尴尬和烦人。所以你打字很快。并犯错误。而且需要更长的时间。它变得更加烦人。这不仅限于我,顺便说一句,我在其他人身上也看到了这一点。结果:无害的小preview()是有害的。 -
如果打字会阻碍对话,任何其他创建情节的方法也会如此。也许您需要移动到 TclTK gui,其中包含用于缩放的滑块、用于线条和点的按钮、用于数据源的下拉菜单。我不相信你的问题就是你认为的那样,重新组织会议协议会更有成效。
标签: r plot output-redirect