Yihui Xie

The Implementation of `yolo = TRUE` in xaringan via yolofy()

Yihui Xie / 2019-03-06


It has been more than two years since Karthik requested the (most famous?) yolo = TRUE feature in xaringan, and I feel amused to see people still having great fun with it.

@tmrkn's tweet about the funny yolo option in xaringan

The implementation was actually not too complicated. The idea is that we just randomly insert new slides with background images (the default is Karl’s mustache photo) into existing slides. We know that slide pages are separated by three dashes ---, so what we need to do is to find out the three dashes, and replace a random set of them with

---
background-image: url(path/to/the/image)

---

In fact, there is a function xaringan:::yolofy() to implement this. It has two arguments: x, a character vector of the Markdown source of the original slides, and config, a list of configurations that specify how many times (or probability) you want the image to appear in the slides, and which image you want to use.

x2 = xaringan:::yolofy(
  x = c('---', 'First', '---', 'Second', '---', 'Third'),
  config = list(times = 2, img = 'karl-mustache.jpg')
)
cat(x2, sep = '\n')
---
background-image: url(karl-mustache.jpg)
---
First
---
Second
---
background-image: url(karl-mustache.jpg)
---
Third

If you have read the source code of xaringan::yolofy(), you will realize that the yolo option of xaringan::moon_reader is flexible. Below are all valid usage:

output:
  xaringan::moon_reader:
    yolo: true  # make Karl appear once randomly
output:
  xaringan::moon_reader:
    yolo: false
output:
  xaringan::moon_reader:
    yolo: 3  # let Karl appear at most 3 times
output:
  xaringan::moon_reader:
    yolo: 0.2  # appear in 20% of original slides
output:
  xaringan::moon_reader:
    yolo:
      times: 5
      img: kangaroo.jpg  # use a different image 5 times

This has been one of the most representative “low effort, high return” examples in my packages. I think the actual implementation contributed the least to its influence. The key was Karthik’s idea and Karl Bromona-Lisa’s picture. I was just lucky enough to have seen both.