here::here("code", "_common.R") |>
source()
# Load packages
if (!requireNamespace("pacman")) install.packages("pacman")
pacman::p_load(tidyr)
12 L’ambiente di programmazione
- le nozioni di base dell’ambiente R.
- Leggere il capitolo 3, “Setting Up Your Data Science Project”, del libro Veridical Data Science (Yu & Barter, 2024).
- Leggere il Appendice A della dispensa.
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:
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:
- Esegui
update.packages()
ogni poche settimane per aggiornare i pacchetti. - 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. - 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:
- Portabilità: Il codice diventa più semplice da condividere, poiché non dipende dalla struttura delle directory specifica del computer su cui è stato scritto.
- Organizzazione: Favorisce una struttura chiara e coerente all’interno del progetto, rendendo più facile individuare e accedere ai file.
- 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:
- Vai su
File > New Project
. - Seleziona
New Directory > New Project
. - 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