Espressioni e stampa automatica
R è un linguaggio di espressioni: quasi ogni riga che scrivi produce un valore. Nella console, un'espressione scritta da sola viene valutata e il suo valore stampato automaticamente, senza bisogno di print():
Ogni risultato è preceduto da [1]: è R che ti indica la posizione del primo valore mostrato, un primo indizio del fatto che R ragiona per vettori (ne parliamo più avanti). La stampa automatica ha un tranello da conoscere fin dal primo giorno: vale per le espressioni nude al livello principale. La stessa espressione dentro il corpo di una funzione o in un ciclo for non stampa nulla, ed è per questo che gli script usano cat() o print() in modo esplicito per l'output che devi vedere.
Assegnazione: la freccia
L'operatore di assegnazione di R è <-, una freccia che punta verso il nome che riceve il valore:
Leggi radius <- 5 come "radius riceve 5". Sì, anche = funziona per l'assegnazione al livello principale, e sì, chi inizia si chiede perché mai scrivere due caratteri invece di uno. La risposta è una convenzione che conta davvero: tutte le principali guide di stile, la documentazione di base di R e praticamente tutto il codice R che leggerai usano <- per l'assegnazione, e riservano = a un compito preciso: dare un nome agli argomenti dentro le chiamate di funzione (prossima sezione). Seguire la convenzione rende le due operazioni visivamente distinte. In RStudio, Alt+- (Option+- su macOS) scrive la freccia per te.
Nota che un'assegnazione non stampa nulla: area <- 78.5 salva il valore in silenzio. Ecco perché l'esempio qui sopra ha bisogno di print().
Maiuscole e minuscole
R distingue rigorosamente tra maiuscole e minuscole, sia nei nomi che crei tu sia in quelli forniti dal linguaggio:
Sono due variabili diverse. Allo stesso modo mean() è una funzione e Mean() non esiste. Quando R ti accoglie con object 'x' not found o could not find function, controlla le maiuscole prima di ogni altra cosa: è in assoluto l'errore più comune di chi inizia.
Chiamate di funzione e argomenti nominati
Le funzioni si chiamano con le parentesi tonde, con gli argomenti separati da virgole. Gli argomenti si possono abbinare per posizione, per nome o in modo misto:
La chiamata a seq() mostra la sintassi degli argomenti nominati di R, ed è qui che = si guadagna il suo posto: dentro una chiamata, name = value etichetta un argomento. Gli argomenti nominati ti evitano di ricordare l'ordine dei parametri e rendono le chiamate autoesplicative; seq(0, 100, 25) funziona allo stesso modo ma dice meno a chi legge. La convenzione pratica: passa il primo argomento (di solito i dati) per posizione e dai un nome agli altri.
Chiedere aiuto su qualsiasi funzione richiede un attimo: ?seq nella console apre la sua documentazione.
Tutto è un vettore
L'idea che rende R diverso dagli altri linguaggi: non esistono numeri singoli isolati. Anche 5 è un vettore di lunghezza uno, e le operazioni si applicano elemento per elemento a interi vettori:
Nessun ciclo da nessuna parte, eppure ogni elemento è stato convertito. Nella maggior parte dei linguaggi servirebbero tre iterazioni di un ciclo for; in R è semplice aritmetica. Questa è la vettorizzazione, e influenza tutto: operatori di confronto, funzioni sulle stringhe e funzioni matematiche funzionano tutti così. È il motivo per cui il codice R idiomatico ha molti meno cicli di quanto ti aspetteresti; la storia completa è in vettori.
Graffe e blocchi
I corpi su più righe, per if, cicli e funzioni, si raggruppano con le parentesi graffe {}:
Due cose da notare. La condizione sta tra parentesi tonde ed è un semplice if, non if: né if ... then. E a differenza di Python, in R l'indentazione non ha alcun significato: sono le graffe a definire il blocco, l'indentazione è per le persone. Omettere le graffe nelle istruzioni su una riga è consentito, ma è una classica fonte di bug durante le modifiche; usale sempre.
Spazi e punti e virgola
R ignora gli spazi in più, e un a capo chiude un'istruzione, senza bisogno del punto e virgola:
La divisione su più righe funziona perché la riga 3 finisce con +, quindi R sa che l'espressione non è conclusa. È l'unica regola da ricordare quando spezzi le righe lunghe: vai a capo dopo un operatore o una virgola, mai prima, altrimenti R considererà completa la prima riga. I punti e virgola esistono solo per infilare due istruzioni su una riga (a <- 1; b <- 2): consentito, sconsigliato, facile da evitare.
Stile: come si scrive il codice R
Oltre alla grammatica, R ha convenzioni della comunità molto forti (raccolte nella guida di stile del tidyverse, seguita da quasi tutto l'ecosistema):
<-per l'assegnazione,=solo per gli argomenti dentro le chiamate.- Nomi in
snake_case:monthly_revenue, nonmonthlyRevenuenémonthly.revenue. I punti sono consentiti nei nomi R ma è meglio evitarli: si scontrano con uno schema di nomi usato internamente da R. - Spazi attorno agli operatori (
x <- a * 2, nonx<-a*2) e dopo le virgole. - Indenta con quattro spazi dentro le graffe (alcuni team ne usano due; scegline uno e sii coerente).
- Un'istruzione per riga.
L'interprete non impone niente di tutto questo. Lo impone chiunque legga il tuo codice. La parte sui nomi prosegue in variabili.
Cosa ti porti a casa
- R valuta le espressioni e stampa automaticamente quelle nude nella console, ma non dentro funzioni o cicli.
- Assegna con
<-("riceve"); usa=solo per dare un nome agli argomenti nelle chiamate di funzione. - R distingue completamente tra maiuscole e minuscole: i refusi di maiuscole causano la maggior parte dei primi errori "not found".
- Tutto è un vettore e le operazioni si applicano elemento per elemento:
c(1, 2, 3) * 2dà2 4 6, senza cicli. - Le graffe definiscono i blocchi, gli a capo chiudono le istruzioni, e
snake_casepiù le convenzioni sugli spazi rendono il tuo codice leggibile come quello di tutti gli altri.
Prossimo passo: i commenti, cioè come annotare il codice R e cosa fare visto che R non ha una sintassi per i commenti a blocchi.
Domande frequenti
Cosa significa <- in R?
<- è l'operatore di assegnazione di R: x <- 5 salva il valore 5 sotto il nome x. Leggilo come "riceve". Anche = assegna al livello principale, ma la convenzione della comunità, imposta da tutte le principali guide di stile, è usare <- per l'assegnazione e = solo per dare un nome agli argomenti dentro le chiamate di funzione.
R distingue tra maiuscole e minuscole?
Sì, completamente. total, Total e TOTAL sono tre nomi diversi, e chiamare Mean(x) invece di mean(x) è un errore, non un avviso. Un errore 'could not find function' o 'object not found' molto spesso è solo un refuso di maiuscole.
Servono i punti e virgola in R?
No. Un a capo chiude un'istruzione. I punti e virgola servono solo per stringere due istruzioni su una riga (a <- 1; b <- 2), cosa che le guide di stile comunque sconsigliano. Scrivi un'istruzione per riga e non pensarci più.
Cosa vuol dire che R è vettorizzato?
Le operazioni di base di R lavorano su interi vettori in una volta. c(1, 2, 3) * 2 dà 2 4 6: la moltiplicazione si applica a ogni elemento senza nessun ciclo. Gran parte del codice che in un altro linguaggio sarebbe un ciclo for in R è una singola espressione.