With one R markdown file, I would like to create different possible output pdf documents, where the output file name should be defined within the document. Is there any way to convince markdown to manipulate the output filename in such a way? Ideally I would like to pass the filename by an r chunk.
-
could you post your command? do you want to name files "dynamically"? `paste0("file_",x,".pdf")?` x could be a date or the name of a dataset – rmuc8 Feb 13 '15 at 13:09
-
So far I was using RStudio, performing the knit command without actually looking into more details. But I should have a closer look into ilyas answer, sounds like a much clearer approach. – Sosel Feb 13 '15 at 20:43
4 Answers
You can keep the simplicity of using the RStudio Knit
button and reproducibility of a YAML header by using the undocumented knit
hook to redefine what the button does (default function called is rmarkdown::render
). The output_file
parameter of the render function specifies the file name, so by setting it you override the standard behaviour of using the same prefix as the input filename.
e.g. to always output a file called myfile.pdf
knit: (function(inputFile, encoding) { rmarkdown::render(inputFile, encoding = encoding, output_file = file.path(dirname(inputFile), 'myfile.pdf')) })
The function can be an anonymous one-liner as well as imported from a package, as seen here with slidify.
You can set your own YAML headers (I don't know if this is generally advised anyway), accessible under rmarkdown::metadata$newheader
but they don't seem available from within this sort of function as far as I can see.
As for passing file name in from an R chunk... if you're referring to code chunks below the YAML header, from my experience I don't think that's possible(?). Headers can contain inline R commands (single backtick-enclosed, starting with r
), but seemingly not for this hook function.
Related:
- Rmarkdown GitHub repo issue — output format-specific
output_file
- Blog post I wrote following this question [invalid link, domain for sale as of 20210216] / corresponding GitHub wiki notes

- 1,044
- 10
- 20

- 5,226
- 5
- 36
- 66
-
Error in rmarkdown::metadata$title <- "My Title" : object 'rmarkdown' not found – jzadra Jun 29 '17 at 17:35
-
1@yihuixie, can I pass params$whatever into the output file names that way? My markdown uses params$data to pick up the relevant data file, but it does not look like this works within your one-liner -- `params$data not found`. I can pass whatever I want from a script with `rmarkdown::render(params=list(data="Oct2017data"),output_file="Oct2017_analysis.html")`, but obviously I want to be able to only type it once. – StasK Oct 24 '17 at 23:45
-
1@louis-maddox "As for passing file name in from an R chunk... if you're referring to code chunks below the YAML header, from my experience I don't think that's possible(?). " Is this still the case? Many thanks! – zoowalk Jun 03 '20 at 07:51
-
This is pretty much what I do:
rmarkdown::render('my_markdown_report.Rmd',
output_file = paste('report.', Sys.Date(),
'.pdf', sep=''))
I have three scripts - one pulls the data and process it, second created charts & tables for report. Third one creates report based on markdown file. Code you see above is the part of the third script

- 3,124
- 2
- 26
- 26
-
So far I was only using RStudios knit command to compile some markdown file. If I understand you correctly, you create the actual markdown file using R commands, and even steer the knitting of the markdown using R commands? I was not aware of this approach so far, but I will have a closer look. So far I was also preparing the data and process it in a first script, but already at the second step I manually created a markdown file, putting e.g. various data sources into some report. – Sosel Feb 13 '15 at 20:45
-
Yes. markdown file is separate script on its own, it reads data places charts & tables together. It is called however from the outside script - you can also start/execute it from Rstudio and and will create file with the same name. I however call it from separate script and after rmarkdown creates pdf resulting file is copied into different places – ilya Feb 16 '15 at 02:34
I played around with the Knitr-hook without fully understanding how it works and ran into an ugly workaround. The below coding seems to do the trick. Would be nice if somebody can either explain why it works and/or if it can written less ugly.
For now I lost the shiny input screen but believe this can even be added later. The good thing is that the R-Studio Knit button can still be used.
Please note that the subtitle and the file name are both: This Works! even with space and exclamation mark. The file is saved as This Works!.pdf
The filename and subtitle are set by assigning the text to the object pSubTitle. Note that the params are still in the YAML but are not resulting in a shiny popup screen as they are assigned in the Knitr-hook
---
params:
sub_title:
input: text
label: Sub Title
value: 'my_Sub_Title_and_File_Name'
title : "Parameterized_Title_and_output_file"
subtitle : "`r params$sub_title`"
output:
pdf_document:
keep_tex: false
knit: (
function(inputFile, encoding) {
pSubTitle <- 'This Works!'
rmarkdown::render(
input = inputFile,
encoding = encoding,
params = list(sub_title = pSubTitle),
output_file = pSubTitle) })
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## R Markdown
This is an R Markdown document. ....

- 16,432
- 18
- 38
- 60

- 796
- 5
- 10
My current solution for this and similar questions is through 2 scripts:
- Script1: "xxx.md" file with flexible yaml header, similar to Floris Padt's. This header allows you to generate flexible pdf files with specified title, dates, and other features if you change the params. However, it could not specify flexible pdf names when you render it.
---
params:
feature_input: "XXXA"
date: "08/18/2022"
title: "`Test For `r params$feature_input``"
author: "You Name"
date: "`r params$date`"
output:
pdf_document:
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
## R Markdown and data process
```
#Get parameter from yaml head
input_para <- params$feature_input
input_para
```
- Script2: "YYY.R", which specify params in xxx.md file, and specify pdf file names by output_file when rendering.
featureNames <- c("aaa", "bbb", "ccc")
setwd("path to xxx.md")
for (currentFeature in featureNames) {
rmarkdown::render("xxx.Rmd",
params = list(feature_input = currentFeature,
date = Sys.Date()),
output_file=paste0("output/",currentFeature))
}
- You could update featureNames in yyy.R file, and run yyy.R to get the most flexible use of your xxx.md file.
This solution allows you to:
- update yaml header parameters,
- apply updated yaml parameters in your .md code chunk,
- and save your pdf with specific and flexible names.

- 41
- 5