一个非常简单的问题:
我正在使用文本编辑器编写和运行我的R脚本,以使它们可重现,正如SO的几个成员所建议的那样.
这种方法对我来说非常有效,但我有时必须执行昂贵的操作(例如,read.csv
或者reshape
在2M行数据库上),我最好在R环境中缓存,而不是每次运行脚本时重新运行(这是通常很多次我进步并测试新的代码行).
有没有办法缓存脚本在某一点上的作用,所以每次我只运行增量代码行(就像我通过交互运行R一样)?
谢谢.
## load the file from disk only if it
## hasn't already been read into a variable
if(!(exists("mytable")){
mytable=read.csv(...)
}
Run Code Online (Sandbox Code Playgroud)
编辑:修正错字 - 谢谢德克.
一些简单的方法可以使用一些组合
exists("foo")
测试变量是否存在,否则重新加载或重新计算file.info("foo.Rd")$ctime
您可以比较Sys.time()
并查看它是否比您可以加载的给定时间更新,否则重新计算.CRAN上还有一些缓存包可能很有用.
在你做了一些你发现代价高昂的事情之后,将那个代价高昂的步骤的结果保存在 R 数据文件中。
例如,如果您将 csv 加载到名为的数据框中myVeryLargeDataFrame
,然后从该数据框中创建汇总统计数据到名为 df 的 df 中,VLDFSummary
那么您可以执行以下操作:
save(c(myVeryLargeDataFrame, VLDFSummary),
file="~/myProject/cachedData/VLDF.RData",
compress="bzip2")
Run Code Online (Sandbox Code Playgroud)
压缩选项是可选的,如果您想压缩正在写入磁盘的文件,则可以使用该选项。有关?save
更多详细信息,请参阅。
保存 RData 文件后,您可以注释掉缓慢的数据加载和汇总步骤以及保存步骤,然后像这样简单地加载数据:
load("~/myProject/cachedData/VLDF.RData")
Run Code Online (Sandbox Code Playgroud)
这个答案不依赖于编辑器。它适用于 Emacs、TextMate 等。您可以保存到计算机上的任何位置。但是,我建议将慢速代码保留在 R 脚本文件中,这样您就可以始终知道 RData 文件的来源,并能够在需要时从源数据重新创建它。