Pedro Penzuti Pacheco
Pedro Penzuti Pacheco

Reputation: 36

How can I make the output of my function (several ggplot2 graphs) an html file (displaying those graphs)?

I'm writing a personal use package which trains/tests models, and finally runs a myriad of LIME and DALEX explanations on them. I save these as their own ggplot2 objects (say lime_plot_1), and at the end of the function these are all returned to the global environment.

However, what I would like to have happen is that, at the end of the function, not only would I have these graphs in the environment but a small html report would also be rendered - containing all the graphs that were made.

I would like to point out that while I do know I could do this by simply using the function within an Rmarkdown or Rnotebook, I would like to avoid that as I plan on using it as an .R script to streamline the whole process (since I'll be running this with a certain frequency), and from my experience running big chunks in .Rmd tends to crash R.

Ideally, I'd have something like this:

s_plot <- function(...){

 1. constructs LIME explanations
 2. constructs DALEX explanations
 3. saves explanations as ggplot2 objects, and list them under graphs_list

 4. render graphs_list as an html file
}

1, 2, and 3 all work but I haven't found a way to tackle 4. that doesn't include doing the whole process in a .Rmd file.

EDIT: Thanks to @Richard Telford's and @Axeman's comments, I figured it out. Below is the function:

s_render <- function(graphs_list = graphs_list, meta = NULL, cacheable = NA){

    currentDate <- Sys.Date()

    rmd_file <- paste("/path/to/folder",currentDate,"/report.Rmd", sep="")

    file.create(rmd_file)

    graphs_list <- c(roc_plot, prc_plot, mp_boxplot, vi_plot, corr_plot)

    c(Yaml file headers here, just like in a regular .Rmd) %>% write_lines(rmd_file)
    rmarkdown::render(rmd_file,
            params = list(
                    output_file = html_document(),
                    output_dir = rmd_file))}

Upvotes: 0

Views: 376

Answers (1)

Axeman
Axeman

Reputation: 35392

First, create a simple Rmarkdown file, that takes a parameter. The only objective of this file is to create the report. You can for instance pass a file name:

---
title: "test"
author: "Axeman"
date: "24/06/2019"
output: html_document
params:
  file: 'test.RDS'
---

```{r}
plot_list <- readRDS(params$file)
lapply(plot_list, print)
```

I saved this as test.Rmd.

Then in your main script, write the plot list to a temporary file on disk, and pass the file name to your markdown report:

library(ggplot2)
plot_list <- list(
  qplot(1:10, 1:10),
  qplot(1:10)
)

file <- tempfile()
saveRDS(plot_list, file)
rmarkdown::render('test.Rmd', params = list(file = file))

An .html file with the plots is now on your disk:

enter image description here

Upvotes: 2

Related Questions