I have an Rmd
file with a lot of cached code chunks.
Now I want to keep developing that script using an interactive session to play around and test different solutions before putting the final code in a new chunk of the document.
With a plain R
script, I could just source it to get my interactive session on par with the last line of the script.
However, this would result in (re-)executing all code within the interactive session.
I want to read my Rmd
file into an interactive session ignoring the Markdown part & making use of the existing knitr
cache, ideally without creating any output.
How can I do this?
PS: I am not looking for some IDE-specific way to set this up but for a command that I can run from a simple R session in any terminal emulator.
There are two ways to render an R Markdown document into its final output format. If you are using RStudio, then the “Knit” button (Ctrl+Shift+K) will render the document and display a preview of it. Note that both methods use the same mechanism; RStudio's “Knit” button calls rmarkdown::render() under the hood.
R Markdown has a built-in caching feature that can be enabled by setting cache=TRUE in the chunk's header. The second time the chunk is run, both the visual output and any objects created are loaded from disk.
I finally realized that if I use the knitr dropdown to clear the knitr cache, it clears the rsession memory.
I've created functions load the objects from cached chunks into an interactive R session. The functions are lazyload_cache_dir
and lazyload_cache_labels
and are available in qwraps2 version > 0.2.4
A detailed example of the use of these functions is here:
Quick overview:
Say you have the file report.Rmd
---
title: "A Report"
output: html_document
---
```{r first-chunk, cache = TRUE}
fit <- lm(mpg ~ wt + hp, data = mtcars)
x <- pi
```
```{r second-chunk, cache = TRUE}
fit <- lm(mpg ~ wt + hp + am, data = mtcars)
xx <- exp(1)
```
After knitting you end up with a this project directory
.
├── report_cache
│ └── html
│ ├── first-chunk_bf368425c25f0c3d95cac85aff007ad1.RData
│ ├── first-chunk_bf368425c25f0c3d95cac85aff007ad1.rdb
│ ├── first-chunk_bf368425c25f0c3d95cac85aff007ad1.rdx
│ ├── __packages
│ ├── second-chunk_2c7d6b477306be1d4d4ed451f2f1b52a.RData
│ ├── second-chunk_2c7d6b477306be1d4d4ed451f2f1b52a.rdb
│ └── second-chunk_2c7d6b477306be1d4d4ed451f2f1b52a.rdx
├── report.html
└── report.Rmd
and you want to load the objects from first-chunk
.
lazyload_cache_labels("first-chunk", path = "report_cache/html")
## Lazyloading report_cache/html/first-chunk_bf368425c25f0c3d95cac85aff007ad1
ls()
## [1] "fit" "x"
See the blog post for details on loading only a whole directory of cached objects or loading specific objects from within a cached chunk.
Internally, knitr uses lazyLoad
to load cached results, and so can you:
lazyLoad('knitr_cache_dir/chunk_2c7d6b477306be1d4d4ed451f2f1b52a')
Make sure to supply the filename without the suffix.
I think that running library("knitr"); knit("foo.Rmd")
in the console/R session is the easiest way to do this, although it will rewrite foo.md
, figures, etc.. (Too busy/lazy to test it at the moment.)
You could probably poke around in the cache
directory and read the cached files directly, but that would be a lot more work/trickier.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With