knitr::read_chunk("lab_14-report-quarto_codice-esterno.R")Un documento Quarto con codice esterno
Puoi scaricare qui il progetto RStudio in formato compresso con tutto il necessario per compilare sul tuo PC i report Quarto (codice R integrato, codice R esterno, report parametrico con codice R integrato, report parametrico con codice R esterno).
Chunk preliminari di codice
Per sfruttare il codice R disponibile su un file script esterno si può sfruttare la funzione read_chunk() della libreria knitr:
Nel file script esterno è necessario definire i nomi dei chunk da richiamare con la sintassi: ## @knitr nome-chunk-esterno.
E’ importante sottolineare che al report Quarto è destinato uno spazio di memoria dedicato, per cui è necessario caricare esplicitamente tutte i package necessari all’analisi:
library(tidyverse) # per le usuali manipolazioni sui dati
library(gapminder) # per sfruttare la tabella gapminder
library(knitr) # per la funzione kable per un report tabellare
library(gt) # per la funzione gt per un altro report tabellare
library(gtExtras) # per arricchire la tabella gt con grafici“Tabellone” dati
Anche se non è molto utile in questo caso, è possibile sfruttare la funzione datatable {DT} per stampare in output la tabella dati utilizzata per l’analisi:
DT::datatable(gapminder)Un esempio di tabelle e grafici di sintesi
Di seguito un esempio di un chunk di codice R che produce una tabella formattata sfruttando la funzione kable():
gapminder |>
filter(year == 2007) |>
group_by(continent) |>
summarise(life_exp_avg = mean(lifeExp)) |>
kable()| continent | life_exp_avg |
|---|---|
| Africa | 54.80604 |
| Americas | 73.60812 |
| Asia | 70.72848 |
| Europe | 77.64860 |
| Oceania | 80.71950 |
e di un chunk di codice per la costruzione di un grafico che mostra l’andamento dell’aspettativa media di vita (asse verticale) nei vari continenti (differenti linee) per gli anni (asse orizzontale) disponibili nel dataset:
gapminder |>
group_by(year, continent) |>
summarise(life_exp_avg = mean(lifeExp)) |>
ggplot() +
aes(x = year, y = life_exp_avg, col = continent) +
geom_line()
Alcuni esempi con gtExtras per arricchire le tabelle in output
Il package gtExtras contiene diverse funzioni per arricchire un report tabellare. Un esempio è la funzione plt_bullet, che permette di visualizzare in modo grafico il valore di una colonna della tabella.
Preparo prima la tabella come di seguito illustrato estraendo a caso due paesi per ciascuno dei cinque continenti:
# fisso il seme della sequenza casuale
set.seed(1)
gap_tab <- gapminder |>
group_by(continent) |>
# calcolo il numero di paesi disponibili nel dataset per ciascun continente
# e l'aspettativa media di vita per continente
mutate(nr_countries = n(),
exp_life_avg = mean(lifeExp)) |>
# seleziono due paesi a caso per ciascun continente
slice_sample(n = 2) |>
relocate(continent) |>
ungroup()
# stampo in output il report tabellare sfruttando la funzione gt
gap_tab |> gt()| continent | country | year | lifeExp | pop | gdpPercap | nr_countries | exp_life_avg |
|---|---|---|---|---|---|---|---|
| Africa | Congo, Dem. Rep. | 1992 | 45.548 | 41672143 | 457.7192 | 624 | 48.86533 |
| Africa | Somalia | 1972 | 40.973 | 3840161 | 1254.5761 | 624 | 48.86533 |
| Americas | Venezuela | 2002 | 72.766 | 24287670 | 8605.0478 | 300 | 64.65874 |
| Americas | United States | 1977 | 73.380 | 220239000 | 24072.6321 | 300 | 64.65874 |
| Asia | Kuwait | 1982 | 71.309 | 1497494 | 31354.0357 | 396 | 60.06490 |
| Asia | Singapore | 1982 | 71.760 | 2651869 | 15169.1611 | 396 | 60.06490 |
| Europe | Denmark | 1952 | 70.780 | 4334000 | 9692.3852 | 360 | 71.90369 |
| Europe | Slovak Republic | 1952 | 64.360 | 3558137 | 5074.6591 | 360 | 71.90369 |
| Oceania | Australia | 1997 | 78.830 | 18565243 | 26997.9366 | 24 | 74.32621 |
| Oceania | New Zealand | 1997 | 77.550 | 3676187 | 21050.4138 | 24 | 74.32621 |
A questo punto sfrutto la funzione plt_bullet per visualizzare graficamente la colonna relativa all’aspettativa di vita media: la lunghezza della barra è collegata al volore dell’aspettativa di vita del particolare paese, mentre le linee rosse all’aspettativa di vita media del continente.
gap_tab |>
gt() |>
gt_plt_bullet(column = lifeExp, target = exp_life_avg, width = 45,
palette = c("darkblue", "red"))| continent | country | year | lifeExp | pop | gdpPercap | nr_countries |
|---|---|---|---|---|---|---|
| Africa | Congo, Dem. Rep. | 1992 | 41672143 | 457.7192 | 624 | |
| Africa | Somalia | 1972 | 3840161 | 1254.5761 | 624 | |
| Americas | Venezuela | 2002 | 24287670 | 8605.0478 | 300 | |
| Americas | United States | 1977 | 220239000 | 24072.6321 | 300 | |
| Asia | Kuwait | 1982 | 1497494 | 31354.0357 | 396 | |
| Asia | Singapore | 1982 | 2651869 | 15169.1611 | 396 | |
| Europe | Denmark | 1952 | 4334000 | 9692.3852 | 360 | |
| Europe | Slovak Republic | 1952 | 3558137 | 5074.6591 | 360 | |
| Oceania | Australia | 1997 | 18565243 | 26997.9366 | 24 | |
| Oceania | New Zealand | 1997 | 3676187 | 21050.4138 | 24 |
Un altro esempio interessante è rappresentato dalle sparkline. In questo caso è necessario inserire nelle celle delle colonne in cui si vogliono inserire le sparkline dei vettori che verranno utilizzati per costruire questo tipo di rappresentazione.
Costruisco (e stampo sulla console) la tabella dati:
gap_tab_sparkline <- gapminder |>
group_by(continent) |>
slice_sample(n = 15) |>
summarize(
mean = mean(lifeExp),
sd = sd(lifeExp),
# must end up with list of data for each row in the input dataframe
lifeExp_data = list(lifeExp),
.groups = "drop"
)
gap_tab_sparkline# A tibble: 5 × 4
continent mean sd lifeExp_data
<fct> <dbl> <dbl> <list>
1 Africa 46.0 7.61 <dbl [15]>
2 Americas 62.0 12.0 <dbl [15]>
3 Asia 60.4 10.9 <dbl [15]>
4 Europe 71.4 7.54 <dbl [15]>
5 Oceania 74.1 4.01 <dbl [15]>
E poi sfrutto la funzione gt_plt_sparkline indicando quale colonne contiene i dati necessari alla rappresentazione grafica:
gap_tab_sparkline |>
# ordino i continenti in senso decrescente dell'aspettativa di vita media
arrange(desc(mean)) |>
# rappresentazione tabellare con gt
gt() |>
# cui sostituisco la colonna lifeExp_data
gtExtras::gt_plt_sparkline(lifeExp_data) |>
fmt_number(columns = mean:sd, decimals = 1)| continent | mean | sd | lifeExp_data |
|---|---|---|---|
| Oceania | 74.1 | 4.0 | |
| Europe | 71.4 | 7.5 | |
| Americas | 62.0 | 12.0 | |
| Asia | 60.4 | 10.9 | |
| Africa | 46.0 | 7.6 |