The first example report we saw was rendered into an html file. But
what about Word or PDF files, which can be more usefull or expected in
some situations?. RMarkdown, and a whole ecosystem of other packages,
allows you to generate documents in multiple formats using the same
plain text file.
The way you generate the output file format is by changing the
output
option on the header.
Go back to the example report and find the line that starts with
output:
. Change html_document
to
pdf_document
.
You can also use the “knit” button, clicking on the little arrow on
the right to see all the options.
Now se the button to generate a word document. What changes do you
see on the heather of the file?
Code control
Our example looks quite tidy. We’ve hidden all the code and R
messages so you can concentrate your attention on the table and figures.
But this is not the default behaviour of an Rmd file. Usually the output
will have both code and output, which is fine when you or the person
that will read the report wants to see the code that generates those
results, but it might not be what the final audience of the report might
need. It’s up to you to decide if you want to show the code or not.
To change the options of a chunk code, all you have to do is list the
options inside the square brackets. For example:
```{r nombre-del-chunk, echo = FALSE, message = FALSE}
```
A particularly important set of options are the ones that control
whether the code is executed and whether the result of the code will
remain in the report or not:
eval = FALSE
prevents the chunk code from being run,
so it will not display results either. It is useful for displaying
example code if you are writing, for example, a document to teach
R.
echo = FALSE
runs the chunk code and displays the
results, but hides the code in the report. This is useful for writing
reports for people who do not need to see the R code that generated the
graph or table.
include = FALSE
runs the code but hides both the
code and the results. It is useful to use in general configuration
chunks where you load libraries.
If you are writing a report where you don’t want any code to be
shown, adding echo = FALSE
to each new chunk becomes
tedious. The solution is to change the option globally so that it
applies to all chunks. This is done by the
knitr::opts_chunk$set()
function, which sets the global
options of the chunks that follow it. You’ll find this function on the
first “setup” chunk.
```{r setup, include = FALSE}
knitr::opts_chunk$set(echo = FALSE,
message = FALSE,
warning = FALSE)
```
Curious about how the options works? Change them one at a time and
knit the file each time to see what changes.
Automatisation
At the beginning of this workshop we asked you to change the penguin
species in the example report. The task was not easy because “Gentoo”
appears several times and it is easy to make a mistake. Parameterising a
report allows us to define those kind of parameters in just one place
and get different analyses from the same file.
To generate a parameterised report you have to add an element called
params
to the header with the list of parameters and their
default values.
From now on, you’ll have access to a variable called
params
which is a list containing the parameters and their
value. To access the value of each parameter you use the $
operator as follows:
## [1] "Gentoo"
In this way, the original code can be modified to use the value of
the specie stored in params$species
.
penguins %>%
filter(species == params$species) %>%
ggplot(aes(x = bill_length_mm, y = bill_depth_mm)) +
geom_point(color = "darkorange",
size = 3,
alpha = 0.8) +
geom_smooth(method = "lm", se = FALSE, color = "darkorange") +
theme_minimal() +
labs(title = "Penguin bill dimensions",
subtitle = paste("Bill length and depth for", params$specie, "Penguins at Palmer Station LTER"),
x = "Bill length (mm)",
y = "Bill depth (mm)",
color = "Penguin species")
Here we changed the subtitle to concatenate words with the value
stored in params$species
, this way we can construct the
subtitle pragmatically.
Now the report is ready to function as a parameterised report!
Finally, change “Gentoo” on the yaml to generate a new report for one
of the other species.
LS0tCnRpdGxlOiAiUmVwb3J0aW5nIHlvdXIgd29yayIKb3V0cHV0OiAKICBodG1sX2RvY3VtZW50OgogICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IGZhbHNlCiAgICBoaWdobGlnaHQ6IHRhbmdvCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKCmNodW5rIDwtICJgYGAiCmBgYAoKClRoZSBmaXJzdCBleGFtcGxlIHJlcG9ydCB3ZSBzYXcgd2FzIHJlbmRlcmVkIGludG8gYW4gaHRtbCBmaWxlLiBCdXQgd2hhdCBhYm91dCBXb3JkIG9yIFBERiBmaWxlcywgd2hpY2ggY2FuIGJlIG1vcmUgdXNlZnVsbCBvciBleHBlY3RlZCBpbiBzb21lIHNpdHVhdGlvbnM/LiBSTWFya2Rvd24sIGFuZCBhIHdob2xlIGVjb3N5c3RlbSBvZiBvdGhlciBwYWNrYWdlcywgYWxsb3dzIHlvdSB0byBnZW5lcmF0ZSBkb2N1bWVudHMgaW4gbXVsdGlwbGUgZm9ybWF0cyB1c2luZyB0aGUgc2FtZSBwbGFpbiB0ZXh0IGZpbGUuCgpUaGUgd2F5IHlvdSBnZW5lcmF0ZSB0aGUgb3V0cHV0IGZpbGUgZm9ybWF0IGlzIGJ5IGNoYW5naW5nIHRoZSBgb3V0cHV0YCBvcHRpb24gb24gdGhlIGhlYWRlci4KCj4gR28gYmFjayB0byB0aGUgZXhhbXBsZSByZXBvcnQgYW5kIGZpbmQgdGhlIGxpbmUgdGhhdCBzdGFydHMgd2l0aCBgb3V0cHV0OmAuIENoYW5nZSBgaHRtbF9kb2N1bWVudGAgdG8gYHBkZl9kb2N1bWVudGAuCgpZb3UgY2FuIGFsc28gdXNlIHRoZSAia25pdCIgYnV0dG9uLCBjbGlja2luZyBvbiB0aGUgbGl0dGxlIGFycm93IG9uIHRoZSByaWdodCB0byBzZWUgYWxsIHRoZSBvcHRpb25zLiAKCj4gTm93IHNlIHRoZSBidXR0b24gdG8gZ2VuZXJhdGUgYSB3b3JkIGRvY3VtZW50LiBXaGF0IGNoYW5nZXMgZG8geW91IHNlZSBvbiB0aGUgaGVhdGhlciBvZiB0aGUgZmlsZT8KCiMjIENvZGUgY29udHJvbAoKT3VyIGV4YW1wbGUgbG9va3MgcXVpdGUgdGlkeS4gV2UndmUgaGlkZGVuIGFsbCB0aGUgY29kZSBhbmQgUiBtZXNzYWdlcyBzbyB5b3UgY2FuIGNvbmNlbnRyYXRlIHlvdXIgYXR0ZW50aW9uIG9uIHRoZSB0YWJsZSBhbmQgZmlndXJlcy4gQnV0IHRoaXMgaXMgbm90IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBhbiBSbWQgZmlsZS4gVXN1YWxseSB0aGUgb3V0cHV0IHdpbGwgaGF2ZSBib3RoIGNvZGUgYW5kIG91dHB1dCwgd2hpY2ggaXMgZmluZSB3aGVuIHlvdSBvciB0aGUgcGVyc29uIHRoYXQgd2lsbCByZWFkIHRoZSByZXBvcnQgd2FudHMgdG8gc2VlIHRoZSBjb2RlIHRoYXQgZ2VuZXJhdGVzIHRob3NlIHJlc3VsdHMsIGJ1dCBpdCBtaWdodCBub3QgYmUgd2hhdCB0aGUgZmluYWwgYXVkaWVuY2Ugb2YgdGhlIHJlcG9ydCBtaWdodCBuZWVkLiBJdCdzIHVwIHRvIHlvdSB0byBkZWNpZGUgaWYgeW91IHdhbnQgdG8gc2hvdyB0aGUgY29kZSBvciBub3QuIAoKVG8gY2hhbmdlIHRoZSBvcHRpb25zIG9mIGEgY2h1bmsgY29kZSwgYWxsIHlvdSBoYXZlIHRvIGRvIGlzIGxpc3QgdGhlIG9wdGlvbnMgaW5zaWRlIHRoZSBzcXVhcmUgYnJhY2tldHMuIEZvciBleGFtcGxlOgoKICAgIGByIGNodW5rYHtyIG5vbWJyZS1kZWwtY2h1bmssIGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFfQogICAgCiAgICBgciBjaHVua2AKCkEgcGFydGljdWxhcmx5IGltcG9ydGFudCBzZXQgb2Ygb3B0aW9ucyBhcmUgdGhlIG9uZXMgdGhhdCBjb250cm9sIHdoZXRoZXIgdGhlIGNvZGUgaXMgZXhlY3V0ZWQgYW5kIHdoZXRoZXIgdGhlIHJlc3VsdCBvZiB0aGUgY29kZSB3aWxsIHJlbWFpbiBpbiB0aGUgcmVwb3J0IG9yIG5vdDoKCiogYGV2YWwgPSBGQUxTRWAgcHJldmVudHMgdGhlIGNodW5rIGNvZGUgZnJvbSBiZWluZyBydW4sIHNvIGl0IHdpbGwgbm90IGRpc3BsYXkgcmVzdWx0cyBlaXRoZXIuIEl0IGlzIHVzZWZ1bCBmb3IgZGlzcGxheWluZyBleGFtcGxlIGNvZGUgaWYgeW91IGFyZSB3cml0aW5nLCBmb3IgZXhhbXBsZSwgYSBkb2N1bWVudCB0byB0ZWFjaCBSLgoKKiBgZWNobyA9IEZBTFNFYCBydW5zIHRoZSBjaHVuayBjb2RlIGFuZCBkaXNwbGF5cyB0aGUgcmVzdWx0cywgYnV0IGhpZGVzIHRoZSBjb2RlIGluIHRoZSByZXBvcnQuIFRoaXMgaXMgdXNlZnVsIGZvciB3cml0aW5nIHJlcG9ydHMgZm9yIHBlb3BsZSB3aG8gZG8gbm90IG5lZWQgdG8gc2VlIHRoZSBSIGNvZGUgdGhhdCBnZW5lcmF0ZWQgdGhlIGdyYXBoIG9yIHRhYmxlLgoKKiBgaW5jbHVkZSA9IEZBTFNFYCBydW5zIHRoZSBjb2RlIGJ1dCBoaWRlcyBib3RoIHRoZSBjb2RlIGFuZCB0aGUgcmVzdWx0cy4gSXQgaXMgdXNlZnVsIHRvIHVzZSBpbiBnZW5lcmFsIGNvbmZpZ3VyYXRpb24gY2h1bmtzIHdoZXJlIHlvdSBsb2FkIGxpYnJhcmllcy4KCklmIHlvdSBhcmUgd3JpdGluZyBhIHJlcG9ydCB3aGVyZSB5b3UgZG9uJ3Qgd2FudCBhbnkgY29kZSB0byBiZSBzaG93biwgYWRkaW5nIGBlY2hvID0gRkFMU0VgIHRvIGVhY2ggbmV3IGNodW5rIGJlY29tZXMgdGVkaW91cy4gVGhlIHNvbHV0aW9uIGlzIHRvIGNoYW5nZSB0aGUgb3B0aW9uIGdsb2JhbGx5IHNvIHRoYXQgaXQgYXBwbGllcyB0byBhbGwgY2h1bmtzLiBUaGlzIGlzIGRvbmUgYnkgdGhlIGBrbml0cjo6b3B0c19jaHVuayRzZXQoKWAgZnVuY3Rpb24sIHdoaWNoIHNldHMgdGhlIGdsb2JhbCBvcHRpb25zIG9mIHRoZSBjaHVua3MgdGhhdCBmb2xsb3cgaXQuIFlvdSdsbCBmaW5kIHRoaXMgZnVuY3Rpb24gb24gdGhlIGZpcnN0ICJzZXR1cCIgY2h1bmsuCgogICAgYHIgY2h1bmtge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0KICAgIGtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIAogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgd2FybmluZyA9IEZBTFNFKQogICAgYHIgY2h1bmtgCiAgICAKPiBDdXJpb3VzIGFib3V0IGhvdyB0aGUgb3B0aW9ucyB3b3Jrcz8gQ2hhbmdlIHRoZW0gb25lIGF0IGEgdGltZSBhbmQga25pdCB0aGUgZmlsZSBlYWNoIHRpbWUgdG8gc2VlIHdoYXQgY2hhbmdlcy4KCiMjIEF1dG9tYXRpc2F0aW9uCgpBdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgd29ya3Nob3Agd2UgYXNrZWQgeW91IHRvIGNoYW5nZSB0aGUgcGVuZ3VpbiBzcGVjaWVzIGluIHRoZSBleGFtcGxlIHJlcG9ydC4gVGhlIHRhc2sgd2FzIG5vdCBlYXN5IGJlY2F1c2UgIkdlbnRvbyIgYXBwZWFycyBzZXZlcmFsIHRpbWVzIGFuZCBpdCBpcyBlYXN5IHRvIG1ha2UgYSBtaXN0YWtlLiBQYXJhbWV0ZXJpc2luZyBhIHJlcG9ydCBhbGxvd3MgdXMgdG8gZGVmaW5lIHRob3NlIGtpbmQgb2YgcGFyYW1ldGVycyBpbiBqdXN0IG9uZSBwbGFjZSBhbmQgZ2V0IGRpZmZlcmVudCBhbmFseXNlcyBmcm9tIHRoZSBzYW1lIGZpbGUuIAoKVG8gZ2VuZXJhdGUgYSBwYXJhbWV0ZXJpc2VkIHJlcG9ydCB5b3UgaGF2ZSB0byBhZGQgYW4gZWxlbWVudCBjYWxsZWQgYHBhcmFtc2AgdG8gdGhlIGhlYWRlciB3aXRoIHRoZSBsaXN0IG9mIHBhcmFtZXRlcnMgYW5kIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgoKYGBgeWFtbApwYXJhbXM6CiAgc3BlY2llczogZ2VudG9vCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CnBhcmFtcyA8LSBsaXN0KHNwZWNpZXMgPSAiR2VudG9vIikKYGBgCgpGcm9tIG5vdyBvbiwgeW91J2xsIGhhdmUgYWNjZXNzIHRvIGEgdmFyaWFibGUgY2FsbGVkIGBwYXJhbXNgIHdoaWNoIGlzIGEgbGlzdCBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGVpciB2YWx1ZS4gVG8gYWNjZXNzIHRoZSB2YWx1ZSBvZiBlYWNoIHBhcmFtZXRlciB5b3UgdXNlIHRoZSBgJGAgb3BlcmF0b3IgYXMgZm9sbG93czoKCmBgYHtyfQpwYXJhbXMkc3BlY2llcwpgYGAKCkluIHRoaXMgd2F5LCB0aGUgb3JpZ2luYWwgY29kZSBjYW4gYmUgbW9kaWZpZWQgdG8gdXNlIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2llIHN0b3JlZCBpbiBgcGFyYW1zJHNwZWNpZXNgLgoKYGBge3IgZXZhbD1GQUxTRX0KcGVuZ3VpbnMgJT4lIAogIGZpbHRlcihzcGVjaWVzID09IHBhcmFtcyRzcGVjaWVzKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gYmlsbF9sZW5ndGhfbW0sIHkgPSBiaWxsX2RlcHRoX21tKSkgKwogIGdlb21fcG9pbnQoY29sb3IgPSAiZGFya29yYW5nZSIsCiAgICAgICAgICAgICBzaXplID0gMywKICAgICAgICAgICAgIGFscGhhID0gMC44KSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSwgY29sb3IgPSAiZGFya29yYW5nZSIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIGxhYnModGl0bGUgPSAiUGVuZ3VpbiBiaWxsIGRpbWVuc2lvbnMiLAogICAgICAgc3VidGl0bGUgPSBwYXN0ZSgiQmlsbCBsZW5ndGggYW5kIGRlcHRoIGZvciIsIHBhcmFtcyRzcGVjaWUsICJQZW5ndWlucyBhdCBQYWxtZXIgU3RhdGlvbiBMVEVSIiksCiAgICAgICB4ID0gIkJpbGwgbGVuZ3RoIChtbSkiLAogICAgICAgeSA9ICJCaWxsIGRlcHRoIChtbSkiLAogICAgICAgY29sb3IgPSAiUGVuZ3VpbiBzcGVjaWVzIikgCmBgYAoKSGVyZSB3ZSBjaGFuZ2VkIHRoZSBzdWJ0aXRsZSB0byBjb25jYXRlbmF0ZSB3b3JkcyB3aXRoIHRoZSB2YWx1ZSBzdG9yZWQgaW4gYHBhcmFtcyRzcGVjaWVzYCwgdGhpcyB3YXkgd2UgY2FuIGNvbnN0cnVjdCB0aGUgc3VidGl0bGUgcHJhZ21hdGljYWxseS4KCk5vdyB0aGUgcmVwb3J0IGlzIHJlYWR5IHRvIGZ1bmN0aW9uIGFzIGEgcGFyYW1ldGVyaXNlZCByZXBvcnQhCgo+IEZpbmFsbHksIGNoYW5nZSAiR2VudG9vIiBvbiB0aGUgeWFtbCB0byBnZW5lcmF0ZSBhIG5ldyByZXBvcnQgZm9yIG9uZSBvZiB0aGUgb3RoZXIgc3BlY2llcy4g