rheatmapofficer

Save heatmap output/object


I have a code that makes a bunch of ggplot object, saves them as variables, then adds them to a list. I then loop through the list of plots adding them to slides in a powerpoint file using officeR. This works fine and great, because I can easily do:

my_list <- list()
for (df_num in names(list_o_dfs)){
    df <- list_o_dfs[[df_num]] 
    df %>% ggplot(x=X, y=Y) + geom_point() -> my_plot
    str_glue("df_{df_num}") -> slide_title
    my_list[[slide_title]] <- my_plot
}

Then a little of this lets me save every plot as a slide.

ppt <- read_pptx()
for (plot_ttl in names(my_list)){
  ppt <- add_slide(ppt, "Title and Content")
  ppt <- ph_with(
    ppt,
    value = plot_ttl,
    location = ph_location_label("Title 1")
  )
  ppt <- ph_with(ppt,
                 value = my_list[[plot_ttl]],
                 location = ph_location_label("Content Placeholder 2"))}
  print(ppt, target = "example.pptx"))
  
  }

Along those lines my_list[[df_1]] (or my_plot) will replot the appropriate (or last) plot object for me.

HOWEVER, I would like to use the base R heatmap() function which seems to just output a normal list. So if I call: heatmap(matrix(rexp(200, rate=.1), ncol=20))

I get a lovely heatmap: example heatmap But then I try to store/save it and recall it with something like:

my_list <- list()
heatmap(matrix(rexp(200, rate=.1), ncol=20)) -> hm
my_list[['Heatmap']] <- hm

Calling hm or my_list[['Heatmap']] returns:

$rowInd
 [1] 10  2  6  5  4  8  9  7  1  3

$colInd
 [1]  5 10 11  2 17 14  3 18 19  9 12  6 15  1 20 13  4  7  8 16

$Rowv
NULL

$Colv
NULL

with no plot to accompany it. plot(hm) returns:

Error in xy.coords(x, y, xlabel, ylabel, log) : 
'x' is a list, but does not have components 'x' and 'y'

Is there a way to make an object or variable with my heatmap that can easily be recalled in plot form so I can add it to my powerpoint? Do I have to save it as a png and load it back in?


Solution

  • To export a base plot you have to wrap the plotting code in officer::plot_instr:

    library(officer)
    
    my_list <- lapply(
      1:2,
      \(x) plot_instr(heatmap(matrix(rexp(200, rate = .1), ncol = 20)))
    )
    names(my_list) <- c("plot1", "plot2")
    
    ppt <- read_pptx()
    for (plot_ttl in names(my_list)) {
      ppt <- add_slide(ppt, "Title and Content")
      ppt <- ph_with(
        ppt,
        value = plot_ttl,
        location = ph_location_label("Title 1")
      )
      ppt <- ph_with(ppt,
        value = my_list[[plot_ttl]],
        location = ph_location_label("Content Placeholder 2")
      )
    }
    print(ppt, target = "example.pptx")
    

    enter image description here