Two of My Use Cases of Lazy Evaluation

Yihui Xie 2018-07-31

This is a short follow-up post on Colin Fay’s follow-up post on Thomas Lumley follow-up post on Miles McBain post about quotation. Yeah, I just cannot help it when I see this streak.

I’m not an expert of quotation or lazy evaluation. I just happen to have used them occasionally. I’m going to talk about two use cases of lazy evaluation.

Executing R code — the ninja way

In two of my talks, I used delayed assignments to execute R code for no good reasons except that I just wanted to confuse the audience. After making a delayed assignment like this in advance:

delayedAssign('command', {
  # some R code
})

I can simply type command in the R console to actually execute the code. Of course, you could go with the normal way:

command = function() {
  # some R code
}
command()

But that will be boring, right?

I used this trick in my talks at useR! 2014 and rstudio::conf 2018.

Lazy-loading the cache database in knitr

The caching system in knitr uses lazy-loading by default (the chunk option cache.lazy = TRUE). Lazy-loading means the results you cached will not be loaded in memory unless they are actually used later. This is very similar to the LazyData mentioned in Colin’s post. To those hackers, you may make a lazy-load database using the internal function tools:::makeLazyLoadDB() (again, it is an internal function, so no guarantee in the future), and load the database using lazyLoad().

I don’t quite remember how I discovered this. Chances are I found it by reading the source code of Roger Peng’s cacheSweave package in 2012.