Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using a YAML header argument in knitr

I am making a set of slides using rmarkdown and the LaTeX option of outputting it to beamer.

I have two templates I use in my slides - one specific for the LaTeX options, and one pandoc template that I have modified to account for some additional feature of my slides.

I have defined an option in the YAML header called to_print which is a boolean TRUE/FALSE that I pass to the pandoc template that tells it to add a package and clean up the slides for printing.

I also want to use this variable to define the name of the files. The basic idea being that I want to have one .rmd file for my slides, and then just changing this one option to signify that it's for printing by students, or for me presenting.

I have figured out that I can pass the render function using the knit parameter in the YAML header, but I have to specify to_print = TRUE and set the condition in the ifelse() statement in the output_file correspondingly.

Currently I have:

---
title: "Introduction to R"
subtitle: "Reading and saving data in R"
date: '`r format(Sys.Date())`'
output:
  beamer_presentation:
    fonttheme: professionalfonts
    highlight: tango
    includes:
      in_header: "../../templatefiles/beamer_header.tex"
    template: "../../templatefiles/beamer_template.tex"
    incremental: no
    keep_tex: yes
    slide_level: 3
    theme: Warsaw
    toc: yes
fontsize: 10pt
fontenc: T1
to_print: TRUE
knit: (function(inputFile, encoding) { rmarkdown::render(inputFile, encoding = encoding, 
       output_file = file.path(ifelse(TRUE,
                                      gsub("\\..*","_handout.pdf", inputFile), 
                                      gsub("\\..*", ".pdf", inputFile)))) })
---

I would like to specify just one parameter that is then used to signify if this is a handout to be printed:

Pseudo-code:

to_print: TRUE
knit: (function(inputFile, encoding) {rmarkdown::render(inputFile, encoding = encoding, 
       output_file = file.path(ifelse(YAML_PARAM$to_print,
                                      gsub("\\..*","_handout.pdf", inputFile), 
                                      gsub("\\..*", ".pdf", inputFile)))) })

Is this possible, or something equivalent that would let me have one .rmd file with a boolean to toggle presentation vs. printing?

like image 391
kristang Avatar asked Apr 15 '16 08:04

kristang


1 Answers

You can use the rmarkdown::yaml_front_matter() function:

---
title: "Introduction to R"
subtitle: "Reading and saving data in R"
date: '`r format(Sys.Date())`'
output:
  beamer_presentation:
    fonttheme: professionalfonts
    highlight: tango
    includes:
      in_header: "../../templatefiles/beamer_header.tex"
    template: "../../templatefiles/beamer_template.tex"
    incremental: no
    keep_tex: yes
    slide_level: 3
    theme: Warsaw
    toc: yes
fontsize: 10pt
fontenc: T1
to_print: TRUE
knit: (function(inputFile, encoding) { rmarkdown::render(inputFile, encoding = encoding, 
       output_file = file.path(ifelse(rmarkdown::yaml_front_matter(inputFile)$to_print,
                                      gsub("\\..*","_handout.pdf", inputFile), 
                                      gsub("\\..*", ".pdf", inputFile)))) })
---
like image 67
RLesur Avatar answered Sep 27 '22 17:09

RLesur