Un documento Quarto con codice esterno

Author

DV

Nota

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:

knitr::read_chunk("lab_14-report-quarto_codice-esterno.R")

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()
Figure 1: Andamento dell’aspettativa di vita medio nei cinque continenti

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 70.3
Europe 71.4 7.5 78.4
Americas 62.0 12.0 76.4
Asia 60.4 10.9 53.8
Africa 46.0 7.6 60.2