Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Access name of .rmd file and use in R

Tags:

markdown

r

knitr

I am knitting a markdown file called MyFile.rmd. How can I access the string MyFile during the knitting and use it for:

  • use in the title section of the YAML header?
  • use in subsequent R chunk?

    ---
    title: "`r rmarkdown::metadata$title`"
    author: "My Name"
    date: "10. Mai 2015"
    output: beamer_presentation
    ---
    
    ## Slide 1
    
    ```{r}
    
    rmarkdown::metadata$title
    
    ```
    

leads to...

enter image description here

... which is incorrect as the file I am knitting is named differently.

> sessionInfo()
R version 3.1.2 (2014-10-31)
Platform: x86_64-apple-darwin13.4.0 (64-bit)

locale:
[1] de_DE.UTF-8/de_DE.UTF-8/de_DE.UTF-8/C/de_DE.UTF-8/de_DE.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] digest_0.6.8    htmltools_0.2.6 rmarkdown_0.5.1 tools_3.1.2     yaml_2.1.13
like image 687
user2030503 Avatar asked May 10 '15 15:05

user2030503


2 Answers

rmarkdown::metadata gives you the list of the meta data of the R Markdown, e.g. rmarkdown::metadata$title will be the title of your document. An example:

---
title: "Beamer Presentation Title"
author: "My Name"
date: "10\. Mai 2015"
output: beamer_presentation
---

## Slide 1

Print the title in a code chunk.

```{r}
rmarkdown::metadata$title
```

## Slide 2

The title of the document is `r rmarkdown::metadata$title`.

To obtain the filename of the input document, use knitr::current_input().

like image 182
Yihui Xie Avatar answered Oct 06 '22 17:10

Yihui Xie


You could use the yaml library, like so:

library(yaml)

# Read in the lines of your file
lines <- readLines("MyFile.rmd")
# Find the header portion contained between the --- lines. 
header_line_nums <- which(lines == "---") + c(1, -1)
# Create a string of just that header portion
header <- paste(lines[seq(header_line_nums[1], 
                          header_line_nums[2])], 
                collapse = "\n")
# parse it as yaml, which returns a list of property values
yaml.load(header)

If you save the list returned by yaml.load, you can use it in various chunks as needed. To get the title, you can do this:

properties <- yaml.load(header)
properties$title
like image 31
River Avatar answered Oct 06 '22 17:10

River