--- title: "powerup" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Mirage} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` ```{r setup} library(powerup) ``` For the purpose of this document, let's start by laying out some vocabulary about Microsoft PowerPoint documents. - A document is made of several slides - Each slide has a particular layout, from the list of available layouts in the document's template - A placeholder is a location on the slide for content can be added to - A layout is made of several potential placeholders - A slide can have various displays (text, images, etc ...) placed either in these pre-existing placeholders, or in placeholders that are specific to the slide. The goal of the `powerup` package is to help with creating and updating powerpoint documents throughout all these steps. As such, powerup can create and delete slides, or update them by adding displays to either predefined or bespoke placeholders. This vignette should give users enough information to get started with creating powerpoint documents and add various contents to them with powerup. # Loading Powerpoint documents You can start by using the `load_pptx()` to load your own Powerpoint document, or simply start with an empty document with the basic PowerPoint Template. ```{r} # pptx <- load_pptx("//where/is/your/document.pptx") pptx <- load_pptx() ``` `powerup` uses a custom S3 class `` that thinly wraps around the "rpptx" class from `officer` to add some `powerup` specific functionality. ```{r} pptx ``` # Adding slides Once you have a presentation, you typically want to add slides with content. Although these two operations can be performed together, we have separated them in this document for clarity. The `add_slide()` function can be used to add one slide with a given layout from the list of available layouts, it returns a modified `pptx` object which allows adding multiple slides by chaining calls to `add_slide()`. Let's start by creating a document from the PowerPoint template with 3 slides. ```{r} pptx <- load_pptx() |> add_slide("Title Slide") |> add_slide("Title and Content") |> add_slide("Two Content") ``` By default, the new slide is placed at the end of document, but `add_slide()` also accepts an `index=` argument if you'd like the new slide to be added elsewhere. This typically happens when you work on a document interactively. ```{r} pptx <- load_pptx() |> add_slide("Title Slide") |> # slide 1 at this point add_slide("Two Content") # slide 2 at this point pptx <- pptx |> add_slide("Comparison", index = 2) ``` When you do this, you have to be mindful that this moves slides around in the document, i.e. the second slide now has the "Comparison" layout and the slide with layout "Two Content" has moved to third position. # Layouts The `list_layouts()` function gives you a tibble that summarises the available layouts and some of their characteristics: ```{r} list_layouts(pptx) ``` `powerup` offers various ways to choose which layout to use for a new slide. The `list_placeholders()` function gives a glimpse. ```{r} list_placeholders(pptx, layout = "Title Slide") ``` and for a quick visual glance, you can use the tailored `ggplot()` method. ```{r} list_placeholders(pptx, layout = "Title Slide") |> ggplot() ``` # Adding content Once we've added slides, we can add displays with the `update_slide()` function, it takes the document and the slide index as mandatory first arguments, and then a variable number of display specifications, as calls to the `content()` function. Let's illustrate with a simple example that updates the first slide with two simple strings displays. ```{r} pptx <- pptx |> update_slide(index = 1, content("My slide title" , ph = ph_title()), content("Some more information in the sub title", ph = ph_subtitle()) ) ``` `update_slide()` also returns the modified pptx object, so multiple calls can be chained. Adding displays amounts to making a number of calls to the `content()` function to encapsulate: - *what* to add, with the `value=` argument - *where* to add it, via the `ph=` argument # Displays The `content(value=)` argument accepts anything that can be polished by the `polish::polish_content_pptx()` function, which is extensible to allow third party packages to implement it. The `content(...=)` arguments are also passed down to `polish_content_pptx()` in addition to `value=` to fine tune how each value may be polished. For example, `content(value=)` handles the `plot1` and `tbl1` objects created below. ```{r} library(ggplot2) library(dplyr) library(flextable) plot1 <- ggplot(mtcars, aes(mpg, disp)) + geom_point() tbl1 <- mtcars |> select(mpg, disp) |> slice(1:5) |> flextable() ``` # Placeholders The second part of what `content()` needs is information about *where* to inject the display. `powerup` offers ways to precisely specify the placeholder depending on if you intend to target a placeholder from the layout or create one from scratch. This is described in the dedicated vignette. But for the purpose of this document, we only cover the set of predefined placeholders for the most common cases which generally are good enough: - `ph_title()`, `ph_subtitle()` to target Title or SubTitle - `ph_body()`, `ph_body_left()` and `ph_body_right()` to target body placeholders, or more specifically left-most or right-most - `ph_footer()`, `ph_footer_left()` and `ph_footer_right()` for footer placeholders These templated placeholders have carefully selected defaults to first prioritize existing placeholders in the slide or the slide layout, and if no match is found use the predefined settings to create a new placeholder. # Saving the document As we've loaded the document with `load_pptx()`, we can save it with `save_pptx()`. ```{r, eval=FALSE} save_pptx(pptx, path = "updated_deck.pptx") ``` # Wrapping it all together Now that we've covered how to create a powerpoint presentation from a template, add slides, add displays to them, and save the document back to the file system, we can put it all together as a simple script that creates a simple presentation. ```{r} library(powerup) library(ggplot2) library(dplyr) library(flextable) plot1 <- ggplot(mtcars, aes(mpg, disp)) + geom_point() tbl1 <- mtcars |> select(mpg, disp) |> slice(1:5) |> flextable() pptx <- load_pptx() |> add_slide("Title Slide") |> add_slide("Comparison") pptx <- pptx |> update_slide(index = 1, content("Title", ph = ph_title()), content("Sub title", ph = ph_subtitle()) ) |> update_slide(index = 2, content(plot1, ph = ph_body_left()), content(tbl1, ph = ph_body_right()) ) # save_pptx(pptx, "//somewhere/over/the/rainbow.pptx") ``` Alternatively, we can also take advantage of the fact that `add_slide()` can directly handle the `content()` calls, which has the side benefits of: - visually having the layout closer to the displays - avoid having to mentally map which slide is which. The script can then be rewritten in a more concise and expressive form: ```{r} library(powerup) library(ggplot2) library(dplyr) library(flextable) plot1 <- ggplot(mtcars, aes(mpg, disp)) + geom_point() tbl1 <- mtcars |> select(mpg, disp) |> slice(1:5) |> flextable() pptx <- load_pptx() |> add_slide("Title Slide", content("Title", ph = ph_title()), content("Sub title", ph = ph_subtitle()) ) |> add_slide("Comparison", content(plot1, ph = ph_body_left()), content(tbl1, ph = ph_body_right()) ) # save_pptx(pptx, "//somewhere/over/the/rainbow.pptx") ```