Pass arguments to rmarkdown::render in knit button

Is it possible to pass arguments to rmarkdown::render() through the Knit button in RStudio? My naive attempt was to define arguments just like I normally would for an output style. For example:

knit:
  rmarkdown::render:
    output_dir: report

However, this does not work. When I press the Knit button, I see the following at the top of the Rmarkdown pane in RStudio, so the output_dir argument specified in the YAML is not being passed on.

==> rmarkdown::render('/Users/jakethompson/Desktop/test-rmd/test-doc.Rmd',  encoding = 'UTF-8');

Basically, I would like to be able to change the output directory and/or filename in the YAML. I could write a custom function and put it in a package as suggested here, but that would still require me to pass arguments to that function (i.e., the output directory and filename) in the YAML. Alternatively, I could write a custom function directly in the YAML, as below, but that would then require me to copy and paste the function code into every Rmd, which also seems like a less than ideal solution.

knit: (function(input, ...) {
    rmarkdown::render(
      input,
      output_file = 'my-file-name',
      output_dir = 'my-directory',
      envir = globalenv()
    )
  })

Here is a working reprex and my current session info if that is helpful:

---
title: "Test Document"
knit:
  rmarkdown::render:
    output_dir: report
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## R Markdown

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see <http://rmarkdown.rstudio.com>.

When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:

```{r cars}
summary(cars)
```

## Including Plots

You can also embed plots, for example:

```{r pressure, echo=FALSE}
plot(pressure)
```

Note that the `echo = FALSE` parameter was added to the code chunk to prevent printing of the R code that generated the plot.
xfun::session_info()
#> R version 4.0.3 (2020-10-10)
#> Platform: x86_64-apple-darwin17.0 (64-bit)
#> Running under: macOS Big Sur 10.16
#> 
#> Locale: en_US.UTF-8 / en_US.UTF-8 / en_US.UTF-8 / C / en_US.UTF-8 / en_US.UTF-8
#> 
#> Package version:
#>   base64enc_0.1.3      compiler_4.0.3       digest_0.6.27       
#>   evaluate_0.14        glue_1.4.2           graphics_4.0.3      
#>   grDevices_4.0.3      highr_0.8            htmltools_0.5.0.9003
#>   jsonlite_1.7.2       knitr_1.30           magrittr_2.0.1      
#>   markdown_1.1         methods_4.0.3        mime_0.9            
#>   rlang_0.4.9          rmarkdown_2.6.4      stats_4.0.3         
#>   stringi_1.5.3        stringr_1.4.0        tinytex_0.28        
#>   tools_4.0.3          utils_4.0.3          xfun_0.19           
#>   yaml_2.2.1

Created on 2020-12-29 by the reprex package (v0.3.0)

1 Like

This is not the sort of thing you can do in an interactive knit, but there are a few lateral approaches you might consider.

There is an option you can set called rstudio.markdownToHTML which gives you complete control over what happens when the Knit button is clicked. Note however that since RStudio mostly relies on the rmarkdown package's default behavior, most of the R Markdown tooling in the IDE stands down when that option is engaged since it has no idea what you're doing. More here:

https://support.rstudio.com/hc/en-us/articles/200552186-Customizing-Markdown-Rendering

You might also consider writing an add-in which starts a background job that runs whatever render command you like.

https://rstudio.github.io/rstudioaddins/

1 Like

I would second this as a feature request, for the knit button.

This topic was automatically closed 21 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.

I just figured out a way to approach this, so I am documenting in case it will be useful to others. Essentially, I am able to take a function factory-esque approach.

To recap, what we want to do but cannot do is:

knit:
  mypkg::my_render_fx:
    option1: true

because knit does not seem to respect parameters in the same way as output.

So, my idea is: instead of parameterizing my_render_fx(), write a second function than generates a parameterless my_render_fx() on the fly. This second function is a "function factory" of sorts.

So if my ideal function is:

my_render_fx <- function(input, option1, ...) {do stuff and then call render}

I can write a function like

my_render_factory <- function(option1) {

  f <- function(input, ...) {my_render_fx(input, option1, ...)}

}

Then, within the R Markdown, I can use the fact that R expressions can be evaluated in YAML if prefixed with !r to get my function to dynamically generate the function I wanted on the fly:

knit: !r mypkg::my_render_factory(option1 = TRUE)
1 Like