12  L’ambiente di programmazione

In questo capitolo imparerai a
  • le nozioni di base dell’ambiente R.
Prerequisiti
Preparazione del Notebook
here::here("code", "_common.R") |> 
  source()

# Load packages
if (!requireNamespace("pacman")) install.packages("pacman")
pacman::p_load(tidyr)

12.1 Introduzione

Programmare presuppone necessariamente un ambiente di programmazione. Una cattiva gestione di questo ambiente può causare il malfunzionamento degli script, rendendo fondamentale imparare a gestirlo correttamente.

Nota: In R, il termine “ambiente” ha un significato specifico, riferendosi allo spazio di lavoro in cui gli oggetti vengono memorizzati durante una sessione. In questo capitolo, tuttavia, il termine si riferisce allo stato complessivo del tuo computer mentre programmi, inclusa l’organizzazione dei file, la versione di R che stai usando e altre impostazioni.

L’ambiente può influenzare persino il comportamento delle funzioni più basilari. Considera il seguente esempio:

print(1:9)

Questo potrebbe produrre il seguente output:

[1] 1 2 3 4 5 6 7 8 9

Tuttavia, modificando l’opzione di larghezza in R, il comportamento cambia:

# Dopo aver modificato options(width)
options(width = 10)
print(1:9)

In questo caso, l’output potrebbe essere:

[1] 1 2 3
[4] 4 5 6
[7] 7 8 9

La differenza è dovuta a un’opzione dell’ambiente, width, che regola il numero massimo di caratteri visualizzati per ogni riga.

12.2 File system

Prima di iniziare a organizzare un progetto in R, è fondamentale seguire alcune linee guida per strutturare e nominare i file in modo efficace. Spesso si tende a sottovalutare l’importanza di una buona organizzazione, ma adottare un sistema coerente può far risparmiare tempo prezioso nella ricerca e gestione dei progetti passati. Danielle Navarro ha creato una presentazione sulla struttura dei progetti, nella quale propone tre principi fondamentali per la gestione dei file:

  • essere gentili con le macchine;
  • essere gentili con gli esseri umani;
  • facilitare l’ordinamento e la ricerca.

12.2.1 Essere gentili con le macchine

Le macchine possono confondersi con spazi, caratteri speciali (come ^.*?+|$"), e lettere accentate. Per evitare problemi:

  • usa solo lettere minuscole, numeri, trattini _ o -;
  • evita caratteri speciali e spazi nei nomi dei file;
  • evita le lettere accentate;
  • usa estensioni coerenti, come .R per gli script R.

Esempi:

# Buono
progetto01_analisi_dati.R

# Cattivo
Progetto "Analisi Dati".R

12.2.2 Essere gentili con gli umani

Gli esseri umani hanno bisogno di contesto. Evita nomi vaghi e usa descrizioni significative.

# Buono
analisi01_statistiche_descrittive.R
note02_intro_modello.docx

# Cattivo
01.R
appunti.docx

Evitate categoricamente l’uso di spazi nei nomi di file, cartelle o oggetti in R. Anche se il sistema operativo potrebbe consentirlo, questa pratica può generare problemi futuri, complicare il debugging e rendere il codice meno leggibile e portabile. Per evitare questi inconvenienti, adottate sempre nomi privi di spazi, preferendo separatori come trattini bassi (_) o trattini (-).

12.2.3 Facilitare l’ordinamento e la ricerca

Se i nomi dei file includono date, usa sempre il formato YYYY-MM-DD per permettere un ordinamento automatico.

# Buono
2024-01-01_analisi.R
2024-02-15_riassunto.docx

# Cattivo
1-gennaio-2024.R
riassunto-15-02-2024.docx

Se devi ordinare i file in base a qualcosa di diverso dalle date, usa numeri con lo zero iniziale per mantenere l’ordine.

reading01_shakespeare_romeo-and-juliet.docx
reading02_shakespeare_romeo-and-juliet.docx
...
reading11_shakespeare_romeo-and-juliet.docx
notes01_shakespeare_romeo-and-juliet.docx
...

12.3 Versioni di R e pacchetti

Aggiornare regolarmente R e i pacchetti è essenziale per evitare bug e sfruttare le nuove funzionalità. Ecco alcune buone pratiche:

  1. Esegui update.packages() ogni poche settimane per aggiornare i pacchetti.
  2. Aggiorna la versione di R ogni pochi mesi. Su Windows puoi usare il pacchetto installr, mentre su altri sistemi puoi scaricare l’ultima versione dal sito ufficiale di R.
  3. Mantieni aggiornato anche il sistema operativo.

12.4 Progetti in R

Se hai seguito i consigli finora, avrai creato una cartella per tutti i tuoi progetti di programmazione e la tua installazione di R sarà aggiornata. Ora è il momento di organizzare i tuoi progetti in R.

12.4.1 Percorsi Assoluti e Relativi

Un percorso assoluto parte dalla directory principale del tuo computer (ad esempio, / su Linux/MacOS o C:/ su Windows) e indica in modo completo e univoco la posizione di un file o di una cartella. Un percorso relativo, invece, parte dalla directory corrente del progetto o dalla directory di lavoro impostata e descrive la posizione di un file in relazione a questa.

Ad esempio, il percorso assoluto del file utilizzato per generare questa pagina HTML potrebbe essere ottenuto così:

fs::path_abs("05_environment.qmd")
#> /Users/corrado/_repositories/psicometria-r/chapters/R/05_environment.qmd

12.5 Funzione here()

Se il progetto si trova nella cartella psicometria-r, possiamo utilizzare la funzione here() del pacchetto here per indicare la posizione del file 05_environment.qmd in modo relativo. Ecco un esempio:

file.exists(here::here("chapters", "R", "07_environment.qmd"))
#> [1] TRUE

In questo caso, il file 07_environment.qmd è contenuto nella cartella chapters/R, che si trova all’interno della directory principale del progetto. Grazie a here(), non è necessario specificare manualmente la posizione del progetto: questa funzione identifica automaticamente la directory principale e consente di indicare solo il percorso relativo del file rispetto ad essa. In altre parole, puoi riferirti al file 07_environment.qmd semplicemente fornendo il percorso relativo all’interno della struttura del progetto, lasciando a here() il compito di gestire il contesto globale.

12.5.1 Perché preferire i percorsi relativi?

L’utilizzo di percorsi relativi con here() offre numerosi vantaggi:

  1. Portabilità: Il codice diventa più semplice da condividere, poiché non dipende dalla struttura delle directory specifica del computer su cui è stato scritto.
  2. Organizzazione: Favorisce una struttura chiara e coerente all’interno del progetto, rendendo più facile individuare e accedere ai file.
  3. Affidabilità: Riduce il rischio di errori dovuti a percorsi assoluti errati, soprattutto quando il progetto viene spostato o condiviso.

12.5.2 Buone pratiche

  • Usare sempre percorsi relativi: Questo assicura che il progetto sia facilmente eseguibile su altri sistemi senza necessità di modifiche ai percorsi.
  • Impostare una struttura coerente del progetto: Organizzare i file in cartelle ben definite (ad esempio, data, scripts, outputs) facilita l’uso di percorsi relativi.

In sintesi, specificare i percorsi relativi rispetto alla directory principale del progetto è una buona pratica essenziale per garantire portabilità, organizzazione e riproducibilità del lavoro.

12.5.3 Creare un progetto in R

Un progetto R è semplicemente una cartella con un file .Rproj. Puoi crearne uno con RStudio o con il pacchetto usethis.

In RStudio:

  1. Vai su File > New Project.
  2. Seleziona New Directory > New Project.
  3. Dai un nome al progetto e scegli la sua posizione.

Con usethis:

usethis::create_project("path/alla/cartella")

Esempio:

usethis::create_project("/Users/corrado/_repositories/psicometria-r")

Vedremo nel Capitolo 14 come organizzare i file all’interno di un progetto.

Informazioni sull’Ambiente di Sviluppo

sessionInfo()
#> R version 4.4.2 (2024-10-31)
#> Platform: aarch64-apple-darwin20
#> Running under: macOS Sequoia 15.3.1
#> 
#> Matrix products: default
#> BLAS:   /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRblas.0.dylib 
#> LAPACK: /Library/Frameworks/R.framework/Versions/4.4-arm64/Resources/lib/libRlapack.dylib;  LAPACK version 3.12.0
#> 
#> locale:
#> [1] C/UTF-8/C/C/C/C
#> 
#> time zone: Europe/Rome
#> tzcode source: internal
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#>  [1] thematic_0.1.6   MetBrewer_0.2.0  ggokabeito_0.1.0 see_0.10.0      
#>  [5] gridExtra_2.3    patchwork_1.3.0  bayesplot_1.11.1 psych_2.4.12    
#>  [9] scales_1.3.0     markdown_1.13    knitr_1.49       lubridate_1.9.4 
#> [13] forcats_1.0.0    stringr_1.5.1    dplyr_1.1.4      purrr_1.0.4     
#> [17] readr_2.1.5      tidyr_1.3.1      tibble_3.2.1     ggplot2_3.5.1   
#> [21] tidyverse_2.0.0  rio_1.2.3        here_1.0.1      
#> 
#> loaded via a namespace (and not attached):
#>  [1] generics_0.1.3    stringi_1.8.4     lattice_0.22-6    hms_1.1.3        
#>  [5] digest_0.6.37     magrittr_2.0.3    evaluate_1.0.3    grid_4.4.2       
#>  [9] timechange_0.3.0  fastmap_1.2.0     rprojroot_2.0.4   jsonlite_1.9.1   
#> [13] mnormt_2.1.1      cli_3.6.4         crayon_1.5.3      rlang_1.1.5      
#> [17] munsell_0.5.1     withr_3.0.2       tools_4.4.2       parallel_4.4.2   
#> [21] tzdb_0.4.0        colorspace_2.1-1  pacman_0.5.1      vctrs_0.6.5      
#> [25] R6_2.6.1          lifecycle_1.0.4   fs_1.6.5          htmlwidgets_1.6.4
#> [29] pkgconfig_2.0.3   pillar_1.10.1     gtable_0.3.6      glue_1.8.0       
#> [33] xfun_0.51         tidyselect_1.2.1  rstudioapi_0.17.1 farver_2.1.2     
#> [37] htmltools_0.5.8.1 nlme_3.1-167      rmarkdown_2.29    compiler_4.4.2

Bibliografia

Yu, B., & Barter, R. L. (2024). Veridical data science: The practice of responsible data analysis and decision making. MIT Press.