2

我在 R 中进行了大量数据探索,我想保留我生成的每个图(来自交互式 R 控制台)。我正在考虑一个目录,我绘制的所有内容都会自动保存为带时间戳的 PDF。我也不希望这会干扰绘图的正常显示。

有什么我可以添加到我~/.Rprofile的可以做到这一点的吗?

4

3 回答 3

7

一般的想法是编写一个脚本来生成情节以重新生成它。ESS 文档(在自述文件中)在“使用 ESS 的哲学”下很好地说明了这一点:

源代码是真实的。对象是源代码的实现。每个用户修改对象的源都放置在一个或多个特定目录中,以供以后编辑和检索。

使用任何允许逐步(或按区域)执行命令的编辑器,您都可以通过这种方式跟踪您的工作。

于 2012-07-11T15:56:13.900 回答
3

最好的方法是使用脚本文件(或 sweave 或 knitr 文件),以便您可以在需要时重新创建所有图形(到 pdf 文件或其他文件中)。

但这是一种方法的开始,它可以满足您所要求的基本功能:

savegraphs <- local({i <- 1; 
    function(){
      if(dev.cur()>1){
        filename <- sprintf('graphs/SavedPlot%03d.pdf', i)
        dev.copy2pdf( file=filename )
        i <<- i + 1
      }
    }
})

setHook('before.plot.new', savegraphs )

setHook('before.grid.newpage', savegraphs )

现在,在您创建新图形之前,当前图形将保存到当前工作文件夹的图形文件夹中(确保它存在)。这意味着如果您添加到绘图(linespointsabline等),则将包含注释。但是,您需要运行plot.new才能保存最后一个绘图(如果您关闭当前图形设备而不运行另一个绘图设备plot.new,则不会保存最后一个绘图)。

此版本将覆盖从先前 R 会话保存在同一工作目录中的绘图。如果您使用基础或网格图形以外的其他东西(甚至可能使用一些复杂的绘图),它也会失败。如果偶尔出现一些额外的图,我不会感到惊讶(当在内部创建一个图来获取一些参数时,然后立即用感兴趣的图替换)。我可能还忽略了其他一些事情,但这可能会让你开始。

于 2012-07-12T18:58:57.243 回答
2

您可以为常用的绘图函数编写自己的包装函数。此包装函数将调用屏幕显示和带时间戳的 pdf 版本。您可以source()在 ~/.Rprofile 中使用此功能,以便每次运行 R 时都可以使用它。

对于 latice 的 xyplot,使用该windows设备进行屏幕显示:

library(lattice)
my.xyplot <- function(...){
    dir.create(file.path("~","RPlots"))
    my.chart <- xyplot(...)
    trellis.device(device="windows",height = 8, width = 8)
    print(my.chart)
    trellis.device(device = "pdf",
                   file = file.path("~", "RPlots",
                   paste("xyplot",format(Sys.time(),"_%Y%m%d_%H-%M-%S"),
                         ".pdf", sep = "")),
                   paper = "letter", width = 8, height = 8)
    print(my.chart)
    dev.off()
}

my.data <- data.frame(x=-100:100)
my.data$y <- my.data$x^2

my.xyplot(y~x,data=my.data)

正如其他人所说,您可能应该养成使用 R 脚本工作的习惯,而不是专门从交互式终端工作。如果您保存脚本,那么将来一切都可以重现和修改。尽管如此,“情节日志”是一个有趣的想法。

于 2012-07-11T18:07:26.807 回答