286 lines
18 KiB
HTML
286 lines
18 KiB
HTML
<section data-type="chapter" id="chp-quarto-formats">
|
||
<h1><span id="sec-quarto-formats" class="quarto-section-identifier d-none d-lg-block"><span class="chapter-title">Quarto formats</span></span></h1>
|
||
<section id="introduction" data-type="sect1">
|
||
<h1>
|
||
Introduction</h1>
|
||
<p>So far you’ve seen Quarto used to produce HTML documents. This chapter gives a brief overview of some of the many other types of output you can produce with Quarto.</p>
|
||
<p>There are two ways to set the output of a document:</p>
|
||
<ol type="1"><li>
|
||
<p>Permanently, by modifying the YAML header:</p>
|
||
<pre data-type="programlisting" data-code-language="yaml">title: "Diamond sizes"
|
||
format: html</pre>
|
||
</li>
|
||
<li>
|
||
<p>Transiently, by calling <code>quarto::quarto_render()</code> by hand:</p>
|
||
<div class="cell">
|
||
<pre data-type="programlisting" data-code-language="r">quarto::quarto_render("diamond-sizes.qmd", output_format = "docx")</pre>
|
||
</div>
|
||
<p>This is useful if you want to programmatically produce multiple types of output since the <code>output_format</code> argument can also take a list of values.</p>
|
||
<div class="cell">
|
||
<pre data-type="programlisting" data-code-language="r">quarto::quarto_render("diamond-sizes.qmd", output_format = c("docx", "pdf"))</pre>
|
||
</div>
|
||
</li>
|
||
</ol></section>
|
||
|
||
<section id="output-options" data-type="sect1">
|
||
<h1>
|
||
Output options</h1>
|
||
<p>Quarto offers a wide range of output formats. You can find the complete list at <a href="https://quarto.org/docs/output-formats/all-formats.html" class="uri">https://quarto.org/docs/output-formats/all-formats.html</a>. Many formats share some output options (e.g., <code>toc: true</code> for including a table of contents), but others have options that are format specific (e.g., <code>code-fold: true</code> collapses code chunks into a <code><details></code> tag for HTML output so the user can display it on demand, it’s not applicable in a PDF or Word document).</p>
|
||
<p>To override the default voptions, you need to use an expanded <code>format</code> field. For example, if you wanted to render an <code>html</code> with a floating table of contents, you’d use:</p>
|
||
<pre data-type="programlisting" data-code-language="yaml">format:
|
||
html:
|
||
toc: true
|
||
toc_float: true</pre>
|
||
<p>You can even render to multiple outputs by supplying a list of formats:</p>
|
||
<pre data-type="programlisting" data-code-language="yaml">format:
|
||
html:
|
||
toc: true
|
||
toc_float: true
|
||
pdf: default
|
||
docx: default</pre>
|
||
<p>Note the special syntax (<code>pdf: default</code>) if you don’t want to override any of the default options.</p>
|
||
<p>To render to all formats specified in the YAML of a document, you can use <code>output_format = "all"</code>.</p>
|
||
<div class="cell">
|
||
<pre data-type="programlisting" data-code-language="r">quarto::quarto_render("diamond-sizes.qmd", output_format = "all")</pre>
|
||
</div>
|
||
</section>
|
||
|
||
<section id="documents" data-type="sect1">
|
||
<h1>
|
||
Documents</h1>
|
||
<p>The previous chapter focused on the default <code>html</code> output. There are a number of basic variations on that theme, generating different types of documents. For example:</p>
|
||
<ul><li><p><code>pdf</code> makes a PDF with LaTeX (an open source document layout system), which you’ll need to install. RStudio will prompt you if you don’t already have it.</p></li>
|
||
<li><p><code>docx</code> for Microsoft Word (<code>.docx</code>) documents.</p></li>
|
||
<li><p><code>odt</code> for OpenDocument Text (<code>.odt</code>) documents.</p></li>
|
||
<li><p><code>rtf</code> for Rich Text Format (<code>.rtf</code>) documents.</p></li>
|
||
<li><p><code>gfm</code> for a GitHub Flavored Markdown (<code>.md</code>) document.</p></li>
|
||
<li><p><code>ipynb</code> for Jupyter Notebooks (<code>.ipynb</code>).</p></li>
|
||
</ul><p>Remember, when generating a document to share with decision makers, you can turn off the default display of code by setting global options in document YAML:</p>
|
||
<pre data-type="programlisting" data-code-language="yaml">execute:
|
||
echo: false</pre>
|
||
<p>For <code>html</code> documents another option is to make the code chunks hidden by default, but visible with a click:</p>
|
||
<pre data-type="programlisting" data-code-language="yaml">format:
|
||
html:
|
||
code: true</pre>
|
||
</section>
|
||
|
||
<section id="presentations" data-type="sect1">
|
||
<h1>
|
||
Presentations</h1>
|
||
<p>You can also use Quarto to produce presentations. You get less visual control than with a tool like Keynote or PowerPoint, but automatically inserting the results of your R code into a presentation can save a huge amount of time. Presentations work by dividing your content into slides, with a new slide beginning at each second (<code>##</code>) level header. Additionally, first (<code>#</code>) level headers can be used to indicate the beginning of a new section with a section title slide that is by default centered in the middle.</p>
|
||
<p>Quarto supports a variety of presentation formats, including:</p>
|
||
<ol type="1"><li><p><code>revealjs</code> - HTML presentation with revealjs</p></li>
|
||
<li><p><code>pptx</code> - PowerPoint presentation</p></li>
|
||
<li><p><code>beamer</code> - PDF presentation with LaTeX Beamer.</p></li>
|
||
</ol><p>You can read more about creating presentations with Quarto at <a href="https://quarto.org/docs/presentations/">https://quarto.org/docs/presentations</a>.</p>
|
||
</section>
|
||
|
||
<section id="dashboards" data-type="sect1">
|
||
<h1>
|
||
Dashboards</h1>
|
||
<p>Dashboards are a useful way to communicate large amounts of information visually and quickly. A dashboard-like look can be achieved with Quarto using document layout options like sidebars, tabsets, multi-column layouts, etc.</p>
|
||
<p>For example, you can produce this dashboard:</p>
|
||
<div class="cell">
|
||
<div class="cell-output-display">
|
||
<p><img src="quarto/quarto-dashboard.png" class="img-fluid" alt="Quarto dashboard with the title "Diamonds dashboard". The first tab shows four plots of the diamonds dataset. The second tab shows summary statistics for price and carat of diamonds. The third tab shows an interactive data table of the first 100 diamonds." width="540"/></p>
|
||
</div>
|
||
</div>
|
||
<p>Using this code:</p>
|
||
<div class="cell">
|
||
<pre><code>---
|
||
title: "💍 Diamonds dashboard"
|
||
format: html
|
||
execute:
|
||
echo: false
|
||
---
|
||
|
||
```{r}
|
||
#| label: setup
|
||
#| include: false
|
||
|
||
library(tidyverse)
|
||
library(gt)
|
||
```
|
||
|
||
::: panel-tabset
|
||
## Plots
|
||
|
||
```{r}
|
||
#| layout: [[30,-5, 30, -5, 30], [100]]
|
||
|
||
ggplot(diamonds, aes(x = carat)) + geom_histogram(binwidth = 0.1)
|
||
ggplot(diamonds, aes(x = price)) + geom_histogram(binwidth = 500)
|
||
ggplot(diamonds, aes(x = cut, color = cut)) + geom_bar()
|
||
|
||
ggplot(diamonds, aes(x = carat, y = price, color = cut)) + geom_point()
|
||
```
|
||
|
||
## Summaries
|
||
|
||
```{r}
|
||
diamonds |>
|
||
select(price, carat, cut) |>
|
||
group_by(cut) |>
|
||
summarize(
|
||
across(where(is.numeric), list(mean = mean, median = median, sd = sd, IQR = IQR))
|
||
) |>
|
||
pivot_longer(cols = -cut) |>
|
||
pivot_wider(names_from = cut, values_from = value) |>
|
||
separate(name, into = c("var", "stat")) |>
|
||
mutate(
|
||
var = str_to_title(var),
|
||
stat = str_to_title(stat),
|
||
stat = if_else(stat == "Iqr", "IQR", stat)
|
||
) |>
|
||
group_by(var) |>
|
||
gt() |>
|
||
fmt_currency(columns = -stat, rows = 1:4, decimals = 0) |>
|
||
fmt_number(columns = -stat, rows = 5:8,) |>
|
||
cols_align(columns = -stat, align = "center") |>
|
||
cols_label(stat = "")
|
||
```
|
||
|
||
## Data
|
||
|
||
```{r}
|
||
diamonds |>
|
||
arrange(desc(carat)) |>
|
||
slice_head(n = 100) |>
|
||
select(price, carat, cut) |>
|
||
DT::datatable()
|
||
```
|
||
:::</code></pre>
|
||
</div>
|
||
<p>To learn more about Quarto component layouts, visit <a href="https://quarto.org/docs/interactive/layout.html" class="uri">https://quarto.org/docs/interactive/layout.html</a>.</p>
|
||
</section>
|
||
|
||
<section id="interactivity" data-type="sect1">
|
||
<h1>
|
||
Interactivity</h1>
|
||
<p>Any HTML documents can contain interactive components.</p>
|
||
|
||
<section id="htmlwidgets" data-type="sect2">
|
||
<h2>
|
||
htmlwidgets</h2>
|
||
<p>HTML is an interactive format, and you can take advantage of that interactivity with <strong>htmlwidgets</strong>, R functions that produce interactive HTML visualizations. For example, take the <strong>leaflet</strong> map below. If you’re viewing this page on the web, you can drag the map around, zoom in and out, etc. You obviously can’t do that in a book, so Quarto automatically inserts a static screenshot for you.</p>
|
||
<div class="cell">
|
||
<pre data-type="programlisting" data-code-language="r">library(leaflet)
|
||
leaflet() |>
|
||
setView(174.764, -36.877, zoom = 16) |>
|
||
addTiles() |>
|
||
addMarkers(174.764, -36.877, popup = "Maungawhau") </pre>
|
||
<div class="cell-output-display">
|
||
<div id="htmlwidget-ac96cb3ee4656e2e9ec3" style="width:100%;height:433px;" class="leaflet html-widget"/>
|
||
<script type="application/json" data-for="htmlwidget-ac96cb3ee4656e2e9ec3"><![CDATA[{"x":{"options":{"crs":{"crsClass":"L.CRS.EPSG3857","code":null,"proj4def":null,"projectedBounds":null,"options":{}}},"setView":[[-36.877,174.764],16,[]],"calls":[{"method":"addTiles","args":["https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",null,null,{"minZoom":0,"maxZoom":18,"tileSize":256,"subdomains":"abc","errorTileUrl":"","tms":false,"noWrap":false,"zoomOffset":0,"zoomReverse":false,"opacity":1,"zIndex":1,"detectRetina":false,"attribution":"© <a href=\"https://openstreetmap.org\">OpenStreetMap<\/a> contributors, <a href=\"https://creativecommons.org/licenses/by-sa/2.0/\">CC-BY-SA<\/a>"}]},{"method":"addMarkers","args":[-36.877,174.764,null,null,null,{"interactive":true,"draggable":false,"keyboard":true,"title":"","alt":"","zIndexOffset":0,"opacity":1,"riseOnHover":false,"riseOffset":250},"Maungawhau",null,null,null,null,{"interactive":false,"permanent":false,"direction":"auto","opacity":1,"offset":[0,0],"textsize":"10px","textOnly":false,"className":"","sticky":true},null]}],"limits":{"lat":[-36.877,-36.877],"lng":[174.764,174.764]}},"evals":[],"jsHooks":[]}]]></script></div>
|
||
</div>
|
||
<p>The great thing about htmlwidgets is that you don’t need to know anything about HTML or JavaScript to use them. All the details are wrapped inside the package, so you don’t need to worry about it.</p>
|
||
<p>There are many packages that provide htmlwidgets, including:</p>
|
||
<ul><li><p><strong>dygraphs</strong>, <a href="https://rstudio.github.io/dygraphs/" class="uri">https://rstudio.github.io/dygraphs</a>, for interactive time series visualisations.</p></li>
|
||
<li><p><strong>DT</strong>, <a href="https://rstudio.github.io/DT" class="uri">https://rstudio.github.io/DT/</a>, for interactive tables.</p></li>
|
||
<li><p><strong>threejs</strong>, <a href="https://bwlewis.github.io/rthreejs/" class="uri">https://bwlewis.github.io/rthreejs</a> for interactive 3d plots.</p></li>
|
||
<li><p><strong>DiagrammeR</strong>, <a href="https://rich-iannone.github.io/DiagrammeR" class="uri">https://rich-iannone.github.io/DiagrammeR</a> for diagrams (like flow charts and simple node-link diagrams).</p></li>
|
||
</ul><p>To learn more about htmlwidgets and see a more complete list of packages that provide them visit <a href="https://www.htmlwidgets.org" class="uri">https://www.htmlwidgets.org</a>.</p>
|
||
</section>
|
||
|
||
<section id="shiny" data-type="sect2">
|
||
<h2>
|
||
Shiny</h2>
|
||
<p>htmlwidgets provide <strong>client-side</strong> interactivity — all the interactivity happens in the browser, independently of R. On one hand, that’s great because you can distribute the HTML file without any connection to R. However, that fundamentally limits what you can do to things that have been implemented in HTML and JavaScript. An alternative approach is to use <strong>shiny</strong>, a package that allows you to create interactivity using R code, not JavaScript.</p>
|
||
<p>To call Shiny code from an Quarto document, add <code>server: shiny</code> to the YAML header:</p>
|
||
<pre data-type="programlisting" data-code-language="yaml">title: "Shiny Web App"
|
||
format: html
|
||
server: shiny</pre>
|
||
<p>Then you can use the “input” functions to add interactive components to the document:</p>
|
||
<div class="cell">
|
||
<pre data-type="programlisting" data-code-language="r">library(shiny)
|
||
|
||
textInput("name", "What is your name?")
|
||
numericInput("age", "How old are you?", NA, min = 0, max = 150)</pre>
|
||
</div>
|
||
<p>And you also need a code chunk with chunk option <code>context: server</code> which contains the code that needs to run in a Shiny server.</p>
|
||
<div class="cell">
|
||
<div class="cell-output-display">
|
||
<p><img src="quarto/quarto-shiny.png" class="img-fluid" alt="Two input boxes on top of each other. Top one says "What is your name?", the bottom one "How old are you?"." width="650"/></p>
|
||
</div>
|
||
</div>
|
||
<p>You can then refer to the values with <code>input$name</code> and <code>input$age</code>, and the code that uses them will be automatically re-run whenever they change.</p>
|
||
<p>We can’t show you a live shiny app here because shiny interactions occur on the <strong>server-side</strong>. This means that you can write interactive apps without knowing JavaScript, but you need a server to run them on. This introduces a logistical issue: Shiny apps need a Shiny server to be run online. When you run Shiny apps on your own computer, Shiny automatically sets up a Shiny server for you, but you need a public facing Shiny server if you want to publish this sort of interactivity online. That’s the fundamental trade-off of shiny: you can do anything in a shiny document that you can do in R, but it requires someone to be running R.</p>
|
||
<p>For learning more about Shiny, we recommend reading Mastering Shiny by Hadley Wickham, <a href="https://mastering-shiny.org/">https://mastering-shiny.org</a>.</p>
|
||
</section>
|
||
</section>
|
||
|
||
<section id="websites-and-books" data-type="sect1">
|
||
<h1>
|
||
Websites and books</h1>
|
||
<p>With a little additional infrastructure you can use Quarto to generate a complete website:</p>
|
||
<ul><li><p>Put your <code>.qmd</code> files in a single directory. <code>index.qmd</code> will become the home page.</p></li>
|
||
<li>
|
||
<p>Add a YAML file named <code>_quarto.yml</code> that provides the navigation for the site. In this file, set the <code>project</code> type:</p>
|
||
<ul><li>For a website, set <code>type: book</code>:</li>
|
||
</ul><pre data-type="programlisting" data-code-language="yaml">project:
|
||
type: book</pre>
|
||
<ul><li>For a website, set <code>type: website</code>:</li>
|
||
</ul><pre data-type="programlisting" data-code-language="yaml">project:
|
||
type: website</pre>
|
||
</li>
|
||
</ul><p>For example, the following <code>_quarto.yml</code> file creates a website from three source files: <code>index.qmd</code> (the home page), <code>viridis-colors.qmd</code>, and <code>terrain-colors.qmd</code>.</p>
|
||
<div class="cell">
|
||
<pre><code>project:
|
||
type: website
|
||
|
||
website:
|
||
title: "A website on color scales"
|
||
navbar:
|
||
left:
|
||
- href: index.qmd
|
||
text: Home
|
||
- href: viridis-colors.qmd
|
||
text: Viridis colors
|
||
- href: terrain-colors.qmd
|
||
text: Terrain colors</code></pre>
|
||
</div>
|
||
<p>The <code>_quarto.yml</code> file you need for a book is very similarly structured. The following example shows how you can create a book with four chapters that renders to three different outputs (<code>html</code>, <code>pdf</code>, and <code>epub</code>). Once again, the source files are <code>.qmd</code> files.</p>
|
||
<div class="cell">
|
||
<pre><code>project:
|
||
type: book
|
||
|
||
book:
|
||
title: "A book on color scales"
|
||
author: "Jane Coloriste"
|
||
chapters:
|
||
- index.qmd
|
||
- intro.qmd
|
||
- viridis-colors.qmd
|
||
- terrain-colors.qmd
|
||
|
||
format:
|
||
html:
|
||
theme: cosmo
|
||
pdf: default
|
||
epub: default</code></pre>
|
||
</div>
|
||
<p>We recommend that you use an RStudio project for your websites and books. Based on the <code>_quarto.yml</code> file, RStudio will recognize the type of project you’re working on, and add a Built tab to the IDE that you can use to render and preview your websites and books. Both websites and books can also be rendered using <code>quarto::render()</code>.</p>
|
||
<p>Read more at <a href="https://quarto.org/docs/websites" class="uri">https://quarto.org/docs/websites</a> about Quarto websites and <a href="https://quarto.org/docs/books" class="uri">https://quarto.org/docs/books</a> about books.</p>
|
||
</section>
|
||
|
||
<section id="other-formats" data-type="sect1">
|
||
<h1>
|
||
Other formats</h1>
|
||
<p>Quarto offers even more output formats:</p>
|
||
<ul><li><p>You can write journal articles using Quarto Journal Templates: <a href="https://quarto.org/docs/journals/templates.html" class="uri">https://quarto.org/docs/journals/templates.html</a>.</p></li>
|
||
<li><p>You can output Quarto documents to Jupyter Notebooks with <code>format: ipynb</code>: <a href="https://quarto.org/docs/reference/formats/ipynb.html" class="uri">https://quarto.org/docs/reference/formats/ipynb.html</a>.</p></li>
|
||
</ul><p>See <a href="https://quarto.org/docs/output-formats/all-formats.html" class="uri">https://quarto.org/docs/output-formats/all-formats.html</a> for a list of even more formats.</p>
|
||
</section>
|
||
|
||
<section id="learning-more" data-type="sect1">
|
||
<h1>
|
||
Learning more</h1>
|
||
<p>To learn more about effective communication in these different formats we recommend the following resources:</p>
|
||
<ul><li><p>To improve your presentation skills, try <a href="https://amzn.com/0321820800"><em>Presentation Patterns</em></a>, by Neal Ford, Matthew McCollough, and Nathaniel Schutta. It provides a set of effective patterns (both low- and high-level) that you can apply to improve your presentations.</p></li>
|
||
<li><p>If you give academic talks, you might like the <a href="https://github.com/jtleek/talkguide"><em>Leek group guide to giving talks</em></a>.</p></li>
|
||
<li><p>We haven’t taken it outselves, but we’ve heard good things about Matt McGarrity’s online course on public speaking: <a href="https://www.coursera.org/learn/public-speaking" class="uri">https://www.coursera.org/learn/public-speaking</a>.</p></li>
|
||
<li><p>If you are creating a lot of dashboards, make sure to read Stephen Few’s <a href="https://www.amazon.com/Information-Dashboard-Design-Effective-Communication/dp/0596100167"><em>Information Dashboard Design: The Effective Visual Communication of Data</em></a>. It will help you create dashboards that are truly useful, not just pretty to look at.</p></li>
|
||
<li><p>Effectively communicating your ideas often benefits from some knowledge of graphic design. Robin Williams’ <a href="https://www.amazon.com/Non-Designers-Design-Book-4th/dp/0133966151"><em>The Non-Designer’s Design Book</em></a> is a great place to start.</p></li>
|
||
</ul></section>
|
||
</section>
|