Menu

Sintassi di R: le basi in 5 minuti

Il cuore della sintassi di R: l'assegnazione con <-, le espressioni e la stampa automatica, le chiamate di funzione con argomenti nominati e la regola per cui tutto è un vettore.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

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, non monthlyRevenue né 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, non x<-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) * 2 dà 2 4 6, senza cicli.
  • Le graffe definiscono i blocchi, gli a capo chiudono le istruzioni, e snake_case più 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.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA