Using checkpoint in a markdown document

Andrie de Vries

2017-04-12

1 Introduction

Sometimes you want to use create a report using markdown, and you want to checkpoint the code in this document.

However, running this as part of a RMarkdown process is problematic, since the knitting process runs inside a temporary folder that is different from the current working directory.

To resolve this, I propose a hacky solution: create a “manifest” file in the same folder that contains all of the library() calls.

2 Example

Imagine you have a small script that you want to put in an Rmarkdown document with a checkpoint.

# demo script
library(MASS)
hist(islands)

3 The checkpoint solution

The only way I’ve found to get checkpoint() to work inside an RMardown document, is really a bit of a hack. The workaround is to create a manifest of required packages, and write this to an R file in the working directory.

For example, imagine your R script uses the MASS package, then create a manifest file like this:

```{r, include=FALSE}
# write a manifest to local folder
cat("
library(MASS)
",
file = "manifest.R")
```

This is hacky, since it requires you to construct the list of library() calls by hand and put these into the manifest file.

(Note that you can use include=FALSE in the code block, so that this code doesn’t show up in your rendered document.)

Once this is done, the checkpoint process from here is straight-forward

```{r, include=FALSE}
# Create .checkpoint folder (in tempdir for this example)
td <- tempdir()
dir.create(file.path(td, ".checkpoint"), recursive = TRUE)

# Create the checkpoint
library(checkpoint)
checkpoint("2017-03-28", checkpointLocation = td)
```

4 Check that this works

Now you are ready to put these instructions in an actual code block to see what happens.

# write a manifest to local folder
cat('
library(MASS)
',
file = "manifest.R")

# Create .checkpoint folder (in tempdir for this example)
dir.create(file.path(tempdir(), ".checkpoint"), recursive = TRUE)

# Create the checkpoint
library(checkpoint)
checkpoint("2017-03-28", checkpointLocation = tempdir())
## Scanning for packages used in this project
## No file at path 'C:\Users\adevries\AppData\Local\Temp\RtmpSWqA0D\file589c640e42a3.Rmd'.
## No file at path 'C:\Users\adevries\AppData\Local\Temp\RtmpSWqA0D\file589c5e3f2228.Rmd'.
## No file at path 'C:\Users\adevries\AppData\Local\Temp\RtmpSWqA0D\file589c394a6e76.Rmd'.
## - Discovered 3 packages
## Unable to parse 3 files:
## - checkpoint.Rmd
## - managing-checkpoint-archives.Rmd
## - using-checkpoint-with-knitr.Rmd
## Installing packages used in this project
##  - Installing 'MASS'
## MASS
##  - Installing 'knitr'
## knitr
## also installing the dependencies 'mime', 'stringi', 'magrittr', 'evaluate', 'digest', 'highr', 'markdown', 'stringr', 'yaml'
## checkpoint process complete
## ---

If this worked, you should see that the library path now points to tempdir() and that MASS should be one of only a few package installed:

.libPaths()
## [1] ".../Temp/RtmpIVB6bI/.checkpoint/2017-03-28/lib/x86_64-w64-mingw32/3.3.2"
## [2] ".../Temp/RtmpIVB6bI/.checkpoint/R-3.3.2"
installed.packages()[, "Package"]
##         MASS       digest     evaluate        highr        knitr 
##       "MASS"     "digest"   "evaluate"      "highr"      "knitr" 
##     magrittr     markdown         mime      stringi      stringr 
##   "magrittr"   "markdown"       "mime"    "stringi"    "stringr" 
##         yaml     compiler   KernSmooth         MASS       Matrix 
##       "yaml"   "compiler" "KernSmooth"       "MASS"     "Matrix" 
##         base         boot        class      cluster    codetools 
##       "base"       "boot"      "class"    "cluster"  "codetools" 
##     compiler     datasets      foreign    grDevices     graphics 
##   "compiler"   "datasets"    "foreign"  "grDevices"   "graphics" 
##         grid      lattice      methods         mgcv         nlme 
##       "grid"    "lattice"    "methods"       "mgcv"       "nlme" 
##         nnet     parallel        rpart      spatial      splines 
##       "nnet"   "parallel"      "rpart"    "spatial"    "splines" 
##        stats       stats4     survival        tcltk        tools 
##      "stats"     "stats4"   "survival"      "tcltk"      "tools" 
##        utils 
##      "utils"

5 Your real R code:

Now your real R code follows, and it creates the plot, as expected:

library(MASS)
hist(islands)

6 Conclusion

This is a bit of a hack, but points in a direction for getting your RMarkdown script to be checkpointed.