我在 R 中进行了大量数据探索,我想保留我生成的每个图(来自交互式 R 控制台)。我正在考虑一个目录,我绘制的所有内容都会自动保存为带时间戳的 PDF。我也不希望这会干扰绘图的正常显示。
有什么我可以添加到我~/.Rprofile
的可以做到这一点的吗?
我在 R 中进行了大量数据探索,我想保留我生成的每个图(来自交互式 R 控制台)。我正在考虑一个目录,我绘制的所有内容都会自动保存为带时间戳的 PDF。我也不希望这会干扰绘图的正常显示。
有什么我可以添加到我~/.Rprofile
的可以做到这一点的吗?
一般的想法是编写一个脚本来生成情节以重新生成它。ESS 文档(在自述文件中)在“使用 ESS 的哲学”下很好地说明了这一点:
源代码是真实的。对象是源代码的实现。每个用户修改对象的源都放置在一个或多个特定目录中,以供以后编辑和检索。
使用任何允许逐步(或按区域)执行命令的编辑器,您都可以通过这种方式跟踪您的工作。
最好的方法是使用脚本文件(或 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 )
现在,在您创建新图形之前,当前图形将保存到当前工作文件夹的图形文件夹中(确保它存在)。这意味着如果您添加到绘图(lines
、points
、abline
等),则将包含注释。但是,您需要运行plot.new
才能保存最后一个绘图(如果您关闭当前图形设备而不运行另一个绘图设备plot.new
,则不会保存最后一个绘图)。
此版本将覆盖从先前 R 会话保存在同一工作目录中的绘图。如果您使用基础或网格图形以外的其他东西(甚至可能使用一些复杂的绘图),它也会失败。如果偶尔出现一些额外的图,我不会感到惊讶(当在内部创建一个图来获取一些参数时,然后立即用感兴趣的图替换)。我可能还忽略了其他一些事情,但这可能会让你开始。
您可以为常用的绘图函数编写自己的包装函数。此包装函数将调用屏幕显示和带时间戳的 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 脚本工作的习惯,而不是专门从交互式终端工作。如果您保存脚本,那么将来一切都可以重现和修改。尽管如此,“情节日志”是一个有趣的想法。