class: title-slide, center, middle #.title[Introduzione a R] #.subtitle[Primi passi con R] <img src="data:image/png;base64,#img/arca_logo.svg" width="10%" style="display: block; margin: auto;" /> ###.location[ARCA - @DPSS] ###.author[Filippo Gambarota] --- class: section, center, middle # Primi passi con R --- # Installazione Per l'installazione trovate le indicazioni nella sezione [Installare R e RStudio](https://psicostat.github.io/Introduction2R/install.html) del libro. In generale i passaggi sono: - scaricare R e installare **R** per il vostro sistema operativo - scaricare e installare **RStudio** --- class: section, center, middle # Come si presenta R --- # Console <img src="data:image/png;base64,#img/R_console.png" width="60%" style="display: block; margin: auto;" /> --- # RStudio <img src="data:image/png;base64,#img/rstudio.png" width="90%" style="display: block; margin: auto;" /> --- class: questions, center, middle # Questions? <iframe src="https://giphy.com/embed/ZNnQvIYzIBmZAbrBR7" width="400" height="300" frameBorder="0"></iframe --- class: section, center, middle # I primi passi in R --- # R come calcolatrice In R è possibile effettuare tutte le [operazioni matematiche](https://psicostat.github.io/Introduction2R/first-comands.html#math-operators) e algebriche dalle più semplici alle più avanzate <div style="border: 1px solid #ddd; padding: 0px; overflow-y: scroll; height:400px; overflow-x: scroll; width:1000px; "><table class="table table-striped table-hover table-condensed table-responsive" style="color: black; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> Funzione </th> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> Nome </th> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> Esempio </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> x + y </td> <td style="text-align:left;"> Addizione </td> <td style="text-align:left;"> > 5 + 3 <br />[1] 8 </td> </tr> <tr> <td style="text-align:left;"> x - y </td> <td style="text-align:left;"> Sottrazione </td> <td style="text-align:left;"> > 7 - 2 <br />[1] 5 </td> </tr> <tr> <td style="text-align:left;"> x * y </td> <td style="text-align:left;"> Moltiplicazione </td> <td style="text-align:left;"> > 4 * 3 <br />[1] 12 </td> </tr> <tr> <td style="text-align:left;"> x / y </td> <td style="text-align:left;"> Divisione </td> <td style="text-align:left;"> > 8 / 3 <br />[1] 2.666667 </td> </tr> <tr> <td style="text-align:left;"> x %% y </td> <td style="text-align:left;"> Resto della divisione </td> <td style="text-align:left;"> > 7 %% 5 <br />[1] 2 </td> </tr> <tr> <td style="text-align:left;"> x %/% y </td> <td style="text-align:left;"> Divisione intera </td> <td style="text-align:left;"> > 7 %/% 5 <br />[1] 1 </td> </tr> <tr> <td style="text-align:left;"> x ^ y </td> <td style="text-align:left;"> Potenza </td> <td style="text-align:left;"> > 3 ^ 3 <br />[1] 27 </td> </tr> <tr> <td style="text-align:left;"> abs(x) </td> <td style="text-align:left;"> Valore assoluto </td> <td style="text-align:left;"> > abs(3-5^2) <br />[1] 22 </td> </tr> <tr> <td style="text-align:left;"> sign(x) </td> <td style="text-align:left;"> Segno di un'espressione </td> <td style="text-align:left;"> > sign(-8) <br />[1] -1 </td> </tr> <tr> <td style="text-align:left;"> sqrt(x) </td> <td style="text-align:left;"> Radice quadrata </td> <td style="text-align:left;"> > sqrt(25) <br />[1] 5 </td> </tr> <tr> <td style="text-align:left;"> log(x) </td> <td style="text-align:left;"> Logaritmo naturale </td> <td style="text-align:left;"> > log(10) <br />[1] 2.302585 </td> </tr> <tr> <td style="text-align:left;"> exp(x) </td> <td style="text-align:left;"> Esponenziale </td> <td style="text-align:left;"> > exp(1) <br />[1] 2.718282 </td> </tr> <tr> <td style="text-align:left;"> sin(x)<br />cos(x)<br />tan(x)<br />asin(x)<br />acos(x)<br />atan(x) </td> <td style="text-align:left;"> Funzioni trigonometriche </td> <td style="text-align:left;"> >sin(pi/2) <br />[1]1 <br />>cos(pi/2) <br />[1]6.123234e-17 </td> </tr> <tr> <td style="text-align:left;"> factorial(x) </td> <td style="text-align:left;"> Fattoriale </td> <td style="text-align:left;"> > factorial(6) <br />[1] 720 </td> </tr> <tr> <td style="text-align:left;"> choose(n, k) </td> <td style="text-align:left;"> Coefficiente binomiale </td> <td style="text-align:left;"> > choose(5,3) <br />[1] 10 </td> </tr> </tbody> </table></div> --- # Operatori matematici - Importante considerare l'**ordine delle operazioni** analogo alle regole della matematica: `2 x 3 + 1` prima `2 x 3` e poi `+ 1`. Analogalmente in R: ```r # Senza parentesi 2 * 3 + 1 ``` ``` ## [1] 7 ``` ```r # Con le parentesi (2 * 3) + 1 ``` ``` ## [1] 7 ``` ```r # Con le parentesi forzando un ordine diverso 2 * (3 + 1) ``` ``` ## [1] 8 ``` --- # Operatori relazionali Gli operatori relazionali sono molto utili dentro le **funzioni**, per **selezionare elementi dalle strutture dati** (vedremo più avanti) e in generale per **controllare** alcune sezioni del nostro codice: .pull-left[ ```r 3 > 4 ``` ``` ## [1] FALSE ``` ```r 3 >= 3 ``` ``` ## [1] TRUE ``` ```r 10 < 100 ``` ``` ## [1] TRUE ``` ] .pull-right[ ```r 40 == 40 ``` ``` ## [1] TRUE ``` ```r 10 != 50 ``` ``` ## [1] TRUE ``` ] --- # Operatori logici Gli operatori logici permettono di **combinare espressioni relazionali** e ottenere sempre un valore `TRUE` o `FALSE`: ```r 3 > 4 & 10 < 100 ``` ``` ## [1] FALSE ``` ```r 10 < 100 | 50 > 2 ``` ``` ## [1] TRUE ``` ```r !5 > 4 ``` ``` ## [1] FALSE ``` --- class: section, center, middle # R e gli oggetti --- # R e gli oggetti > “Everything that exists in R is an object” - John Chambers Il concetto di **oggetto** è fondamentale in R. Essenzialmente tutto quello che possiamo creare o utilizzare in R come un numero, un vettore, dei caratteri o delle funzioni sono creati come oggetti. <img src="data:image/png;base64,#img/everything_object.svg" style="display: block; margin: auto;" /> --- # R e le funzioni > “Everything that happen in R is a function call” - John Chambers Anche il concetto di **funzione** è fondamentale in R. Essenzialmente tutto quello che facciamo è chiamare **funzioni** su oggetti ottenendo un nuovo oggetto o modificando un oggetto esistente <img src="data:image/png;base64,#img/everything_function.svg" style="display: block; margin: auto;" /> --- # Cosa possiamo usare/creare in R? - **Numeri**: 100, 20, 6, 5.6 sono tutti numeri intepretati e trattati come tali - **Stringhe**: "ciao", "1" sono *caratteri* che vengono intepretati letteralmente devono essere dichiarati con `""` - **Nomi**: ciao, x sono nomi (senza virgolette) e sono utilizzati per essere associati ad un oggetto (variabile, funzione, etc.) - **operatori**: sono delle funzioni (e quindi oggetti con un nome associato) che si utilizzano in modo particolare. `3 + 4` in questo caso `+` è un operatore (funzione) che si può usare anche come `+`(3, 4) --- # R e gli oggetti - Come creare un oggetto? - Oggetti e nomi - Dove viene creato l'oggetto? --- # Come creare un oggetto? La creazione di un oggetto avviene tramite il comando `<-` oppure `=` in questo modo: `nome <- oggetto`: ```r x ``` ``` ## Error in eval(expr, envir, enclos): object 'x' not found ``` ```r 10 # questo non è un oggetto, non è salvato ``` ``` ## [1] 10 ``` ```r x <- 10 # ora il valore numerico 10 è associato al nome "x" x ``` ``` ## [1] 10 ``` --- # Convenzioni vs regole Ci sono alcune cose da considerare quando si scrive codice ed in particolare si creano oggetti: - **alcune modalità sono errate** --> R ci fornisce un messaggio di errore - **alcune modalità sono sconsigliate** --> funziona tutto ma ci potrebbero essere problemi - **alcune modalità sono stilisticamente errate** --> funziona tutto, nessun problema ma... anche l'occhio vuole la sua parte --- # Oggetti e nomi Il nome di un oggetto è importante sia per l'utente che per il software stesso: ```r 1 <- 10 # errore _ciao <- 10 # errore mean <- 10 # possibile ma pericoloso `1` <- 10 # con i backticks si può usare qualsiasi nome ma poco pratico ``` ``` ## Error: <text>:4:2: unexpected symbol ## 3: ## 4: _ciao ## ^ ``` ```r my_obj <- 10 my.obj <- 10 My_obj <- 10 # attenzione a maiuscole e minuscole ``` --- # Oggetti e nomi (proibiti) In R ci sono anche dei nomi non solo sconsigliati ma proprio **proibiti** che nonostante siano sintatticamente corretti, non possono essere usati (per ovvie ragioni): .pull-left[ ```r mean <- 10 # ok ma sconsigliato function <- 10 ``` ``` ## Error: <text>:4:10: unexpected assignment ## 3: ## 4: function <- ## ^ ``` ] .pull-right[ ```r TRUE <- 4 ``` ``` ## Error in TRUE <- 4: invalid (do_set) left-hand side to assignment ``` ```r T <- 2 # attenzione ``` ] --- # Dove viene creato l'oggetto? Di default gli oggetti sono creati nel **global environment** accessibile con `ls()` o visibile in R Studio con anche alcune informazioni aggiuntive: <img src="data:image/png;base64,#img/global_environment.png" width="90%" style="display: block; margin: auto;" /> --- class: section, center, middle # Non solo numeri (anticipazione) --- # Non solo numeri (anticipazione) In R possiamo usare oltre ai numeri (in senso matematico) anche le **stringhe** ovvero parole, lettere intepretate così come sono: ```r "ciao" # stringa formata da 5 caratteri ``` ``` ## [1] "ciao" ``` ```r x <- "ciao" # associo la stringa ad un oggetto x + 1 # operazioni matematiche con stringhe (ha senso?) ``` ``` ## Error in x + 1: non-numeric argument to binary operator ``` ```r x == "ciao" ``` ``` ## [1] TRUE ``` ```r x > 10 ``` ``` ## [1] TRUE ``` --- class: section, center, middle # Funzioni --- # Funzioni Le funzioni sono un argomento relativamente complesso ed avanzato. Lo tratteremo più avanti nella sezione [Funzioni](https://arca-dpss.github.io/course-R/slides/4_programmazione/4_programmazione.html#6) del capitolo Programmazione in R. Siccome le usiamo fin da subito è importante avere chiari alcuni aspetti: - Funzioni come oggetti - Argomenti obbligatori, opzionali e default - Ordine degli argomenti - Documentazione --- # Funzioni come oggetti Abbiamo già visto che ogni cosa in R è un oggetto. Anche le funzioni seppur molto diverse da altri elementi sono creati e trattati in R come oggetti: ```r myfun <- function(x) { return(x + 3) } ls() ``` ``` ## [1] "file" "math_operators" "my_obj" "My_obj" ## [5] "my.obj" "myfun" "names_function" "pdf" ## [9] "T" "x" ``` Possiamo crearle, eliminarle o sovrascriverle come un normale oggetto. Vedremo più avanti come crearle ma tenete in considerazione che tutte le funzioni che usiamo sono create come oggetti e salvati nell'ambiente (quando facciamo `library()` sono rese disponibili) --- # Argomenti Gli argomenti delle funzioni sono quelli che da *utenti* dobbiamo conoscere ed impostare nel modo corretto per fare in modo che la funzioni faccia quello per cui è stata pensata. Vediamo l'`help` della funzione `mean()` <iframe src="https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/mean" width="900" height="400" frameBorder="0"></iframe --- # Argomenti - `x` è un oggetto (ovviamente 😄). [...] "currently there are methods for numeric/logical vectors...". Quindi `x` deve essere numerico o logico. Ha senso fare la media di caratteri? 🤔 - `trim` - `na.rm` -- Per impostare questi argomenti ci sono 2 regole: - l'ordine non conta SE DEFINISCO NOME DELL'ARGOMENTO con `x = vettore`, `na.rm = TRUE`, etc. - l'ordine conta SE NON DEFINISCO IL NOME DELL'ARGOMENTO. Posso quindi omettere `argomento = valore` ma devo rispettare l'ordine con cui è stata scritta la funzione --- # Argomenti In questo caso proviamo ad usare la funzione `mean()`: ```r myvec <- rnorm(100, 10, 5) mean(myvec) # x definito, trim non definito, na.rm non definito ``` ``` ## [1] 9.348336 ``` ```r mean(myvec, trim = 0.10) # x definito, trim definito, na.rm non definito ``` ``` ## [1] 9.254736 ``` ```r mean(myvec, na.rm = TRUE) # x definito trim non definito, na.rm definito ``` ``` ## [1] 9.348336 ``` ```r mean(myvec, TRUE) # cosa succede? ``` ``` ## Error in mean.default(myvec, TRUE): 'trim' must be numeric of length one ``` --- # Formula Syntax (extra, but useful) - In R vedrete spesso l'utilizzo dell'operatore `~` per fare grafici, statistiche descrittive, modelli lineari etc. L'utilizzo di `y ~ x` permette di creare del codice R che non viene eseguito subito ma può essere eseguito successivamente in un ambiente specifico. - è l'unico caso dove nomi non assegnati possono essere utilizzati senza errori - questo tipo di programmazione si chiama **non-standard evaluation** perchè appunto non funziona come il solito codice R ```r y # y non esiste e quindi ho un errore ``` ``` ## Error in eval(expr, envir, enclos): object 'y' not found ``` ```r y ~ x # usando ~ non ho errori perchè il codice non viene eseguito ``` ``` ## y ~ x ## <environment: 0x5d40c61beed8> ``` ```r `~`(y, x) # l'operatore ~ non è altro che una funzione come quelle che abbiamo visto fino ad ora ``` ``` ## y ~ x ## <environment: 0x5d40c61beed8> ``` --- # Formula Syntax (extra, but useful) Le formule vengono utilizzate in tantissimi contesti. Per fare modelli di regressione ```r # un modello linare -> dipendente ~ indipendenti lm(y ~ x1 + x2) ``` Per fare aggregare un dataset ```r # per aggregare un dataset (vedremo più avanti :) ) aggregate(y ~ x, data = data, FUN = mean) ``` Per fare grafici ```r # per fare grafici boxplot(y ~ x, data = data) ``` --- # Formula Syntax (extra, but useful) In generale, ogni volta che usate delle variabili *unquoted* (senza virgolette) e queste non sono dichiarate nell'ambiente, state probabilmente usando la **non-standard evaluation** e c'è una formula da qualche parte 😄. Per approfondire: <div class="figure" style="text-align: center"> <img src="data:image/png;base64,#img/advancedR.jpg" alt="<a href="https://adv-r.hadley.nz/metaprogramming.html">Capitolo Metaprogramming</a>" width="20%" /> <p class="caption"><a href="https://adv-r.hadley.nz/metaprogramming.html">Capitolo Metaprogramming</a></p> </div> --- class: section, center, middle # Ambiente di lavoro ⚙️ --- # Ambiente di lavoro ⚙️ - Environment - Working directory - Packages --- # Environment Il **working environment** è la vostra *scrivania* quando lavorate in R. Contiene tutti gli oggetti (variabili) creati durante la sessione di lavoro. <img src="data:image/png;base64,#img/global_environment.png" width="90%" style="display: block; margin: auto;" /> --- # Working Directory La working directory è la posizione (cartella) sul vostro PC dove R sta lavorando e nella quale R si aspetta di trovare i vostri file, se non specificato altrimenti <img src="data:image/png;base64,#img/working_directory.png" width="90%" style="display: block; margin: auto;" /> --- # Packages In R è possibile installare e caricare pacchetti aggiuntivi che non fanno altro che rendere disponibili librerie di funzioni create da altri utenti. Per utilizzare un pacchetto: - Installare il pacchetto con `install.packages("nomepacchetto")` - Caricare il pacchetto con `library(nomepacchetto)` - Accedere ad una funzione senza caricare il pachetto `nomepacchetto::nomefunzione()`. Utile se serve solo una funzione o ci sono conflitti --- # Packages <img src="data:image/png;base64,#img/packages.png" width="90%" style="display: block; margin: auto;" /> --- class: section, center, middle # Come lavorare in R --- # Scrivere e organizzare script - Lo script è un file di testo dove il codice viene salvato e puo essere lanciato in successione - Nello script è possibile combinare **codice** e **commenti** <img src="data:image/png;base64,#img/script.png" width="70%" style="display: block; margin: auto;" /> --- # R Projects Gli `R projects` sono una feature implementata in R Studio per organizzare una cartella di lavoro - permettono di impostare la **working directory** in automatico - permettono di usare **relative path** invece che **absolute path** - rendono più **riproducibile** e **trasportabile** il progetto - permettono un **veloce accesso** ad un determinato progetto --- # R Projects Per capire meglio il funzionamento degli R `R projects` e di come sono organizzati i file ho fatto un video che può chiarire la questione: <iframe src="https://www.youtube.com/embed/MvdVqB5brZo?rel=0" width="600" height="400" frameborder="0" allowfullscreen="allowfullscreen"></iframe> --- class: section, center, middle # Come risolvere i problemi ~~nella vita~~ in R --- # Come risolvere i problemi ~~nella vita~~ in R .pull-left[ In R gli errori sono: - inevitabili - parte del codice stesso - educativi Resta solo da capire come affrontarli ] .pull-right[ <iframe src="https://giphy.com/embed/1VT3UNeWdijUSMpRL4" width="300" height="300" frameBorder="0"></iframe ] --- # R ed errori Ci sono diversi livelli di **allerta** quando scriviamo codice: - **messaggi**: la funzione ci restituisce qualcosa che è utile sapere, ma tutto liscio - **warnings**: la funzione ci informa di qualcosa di *potenzialmente* problematico, ma (circa) tutto liscio - **error**: la funzione non solo ci informa di un **errore** ma le operazioni richieste non sono state eseguite -- Ne vedremo e vedrete molti usando R 😄 --- # Come risolvere un errore? .pull-left[ - capire il messaggio - leggere la documentazione della funzione - cercare il messaggio su Google - chiedere aiuto nei forum dedicati ] .pull-right[ <iframe src="https://giphy.com/embed/l3V0b87RQAMgGGoGA" width="300" height="300" frameBorder="0"></iframe ] --- # Come risolvere un errore? - Ogni funzione ha una pagina di documentazione accessibile con `?nomefunzione`, `??nomefunzione` oppure `help(nomefunzione)` - Possiamo cercare anche la documentazione del pacchetto - Possiamo cercare su Google il nome della funzione o l'eventuale messaggio che riceviamo <div class="figure" style="text-align: center"> <img src="data:image/png;base64,#img/help-rm.png" alt="`help(rm)`" width="50%" /> <p class="caption">`help(rm)`</p> </div> --- # Stack overflow [**Stack overflow**](https://stackoverflow.com/) è un forum di discussione riguardo qualsiasi cosa coinvolga codice (statistica, programmazione, etc.). E' pieno di errori comuni, *How to do ...* e di risposte/soluzioni estremamente utili. Nel 90% dei casi il problema che avete è comune ed è già presente una soluzione. <img src="data:image/png;base64,#img/stackoverflow.png" width="80%" style="display: block; margin: auto;" /> --- # Se non trovo una soluzione? Se non trovo una soluzione posso chiedere. Fare una domanda riguardo un errore o un problema di codice non è semplice come sembra. Le fonti dell'errore possono essere molteplici (il mio specifico computer, un pacchetto che ho installato, il codice sorgente etc.). Ecco una guida per chiedere in modo efficace: <div class="figure" style="text-align: center"> <img src="data:image/png;base64,#img/stackoverflow-question.png" alt="<a href="https://stackoverflow.com/help/how-to-ask">https://stackoverflow.com/help/how-to-ask</a>" width="80%" /> <p class="caption"><a href="https://stackoverflow.com/help/how-to-ask">https://stackoverflow.com/help/how-to-ask</a></p> </div>