由于数据集较大,R Markdown 文件编织速度较慢

Tee*_*Tee 5 caching r knitr r-markdown

我是 R Markdown 新手。如果我错过了这个问题的明显答案,我深表歉意。

语境:

我正在使用 R Markdown 中的大型数据集(大约 9000 万行)来生成简短的报告。在处理文件格式时,我想经常编织最终的 HTML 文档(例如,在进行更改后)以查看格式。

问题:

问题是数据集需要很长时间才能加载,因此每次编织都需要很长时间才能执行(大约五到十分钟)。我确实需要所有数据,因此加载较小的文件不是一个可行的选择。当然,我能够对各个块进行编码,因为数据已加载到全局环境中,但格式化非常繁重,因为在不查看针织产品的情况下很难可视化格式化更改的结果。

尝试解决问题:

经过一番研究,我发现并尝试使用cache = TRUEand cache.extra = file.mtime('my-precious.csv') (根据 Yihui's Bookdown 的这一部分)。然而,这个选项不起作用,因为它导致了以下结果:

Error in lazyLoadDBinsertVariable(vars[i], from, datafile, ascii, compress,  : 
  long vectors not supported yet: connections.c:6073
Calls: <Anonymous> ... <Anonymous> -> <Anonymous> -> lazyLoadDBinsertVariable
Run Code Online (Sandbox Code Playgroud)

为了克服这个错误,我添加cache.lazy = FALSE了块选项(如此处所述)。不幸的是,虽然代码有效,但编写文档所需的时间并没有减少。

我对这个过程的有限理解是,具有cache = TRUEcache.extra = file.mtime('my-precious.csv')将导致代码块的执行结果被缓存,以便下次编织文件时,加载上次运行的结果。但是,因为我的文件太大,所以cache = TRUE不起作用,所以我必须使用cache.lazy = FALSE来反转cache = TRUE. 最后,这意味着每次运行文件时数据集都会加载到我的内存中,从而延长了编织文档所需的时间。

我向 R 社区寻求答案的问题:

  1. 当文件大小很大(约 9000 万行)时,有没有办法在 R Markdown 中缓存数据加载块?
  2. 每次编写 R Markdown 文件时,是否有(更好)的方法来避免耗时的数据加载过程?
  3. cache = TRUE我对规避耗时数据加载过程的方法的理解是否正确?如果不是,为什么这个cache = TRUE方法对我不起作用?

任何帮助表示赞赏。

gpi*_*ier 3

每次编写 R Markdown 文件时,是否有(更好)的方法来避免耗时的数据加载过程?

是的。Rmarkdown 报告之外执行计算。

绘图可以保存到文件中并通过表格包含到报告中,knitr::include_graphics(myfile) 表格可以保存到较小的摘要文件中,通过加载fread并通过显示kable

请注意,如果需要循环打印表格,则应指定result=asischunk 选项。

```{r my_chunk_label, results='asis', echo=F}
for(i in 1:length(data_full)) {
  print(kable(data_full[[i]]))
  cat('\n')
}
```
Run Code Online (Sandbox Code Playgroud)

运行一次昂贵的计算,保存结果。Rmarkdown通过易于格式化的简单报告来使用这些结果。

如果您仍然有大型 csv 文件需要加载,您应该使用data.table::fread比基本函数更有效的方法。

其实不久前我也发布过类似的问题。你不是一个人。