R è un linguaggio a tipizzazione dinamica, quindi in generale non è necessario specificare il tipo di una variabile. Il tipo predefinito è numeric, di norma implementato come un numero in virgola mobile a doppia precisione. Per forzare l'uso di interi a 32 bit, usa il suffisso L (abbreviazione di Long).
Ottenere il «tipo» di un oggetto può essere (per ragioni storiche) fonte di confusione.
Le funzioni typeof() e class() sono simili, ma possono restituire risultati leggermente diversi:
typeof(50)
#> [1] "double" # more specific: an implementation detail
typeof(50L)
##> [1] "integer"
class(50)
#> [1] "numeric" # less specific: ignores implementation details
class(50L)
#> [1] "integer"
Potresti anche vedere riferimenti a mode(), che è simile a typeof().
Ignora mode() e storage.mode().
Sono forniti solo per retrocompatibilità.
L'operatore di assegnazione preferito è <-.
Se lavori in RStudio, puoi inserirlo con la scorciatoia da tastiera Alt-minus.
x <- 42
avogadro <- 6.02e23
mystr <- "Hello, World!"
Usare = al posto di <- spesso funziona, ma non sempre, ed è sconsigliato perché è cattivo stile.
Gli operatori sono per lo più simili a quelli di molti altri linguaggi, anche se %% e %/% sono più insoliti.
Questa sintassi con % è un modo per chiamare operatori infissi implementati come macro.
2 + 3 # 5
2 - 3 # -1
2 * 3 # 6
2 / 3 # 0.6666667
8 %/% 3 # 2 (integer division)
8 %% 3 # 2 (remainder)
2 ^ 3 # 8 (exponential)
In R, # avvia un commento su una sola riga.
Non esiste una sintassi separata per i commenti su più righe.
Per definire una funzione:
squareit <- function(x) {
x * x
}
Le funzioni possono avere zero o più argomenti, separati da virgole.
Le parentesi () sono necessarie con function(), anche se non ci sono parametri.
È possibile specificare valori predefiniti per gli argomenti di una funzione, ma questi devono venire dopo tutti gli argomenti senza valore predefinito e usano = e non <- per assegnare il valore predefinito.
Come esempio piuttosto inutile:
squareit <- function(x = 42) {
x * x
}
squareit()
#> [1] 1764
Le parentesi graffe { } non sono strettamente obbligatorie per i corpi di funzione su una sola riga, ma includerle è considerato buono stile.
R restituisce automaticamente il valore finale di una funzione, come negli esempi qui sopra.
return() può essere usato in qualsiasi punto del corpo della funzione per rendere esplicito un valore restituito.
Restituisce immediatamente il valore specificato e termina la funzione senza eseguire nessuna delle espressioni rimanenti nel corpo della funzione.
Una chiamata esplicita a return() di solito serve solo se vuoi uscire dalla funzione in anticipo e restituire un valore specifico per qualche motivo.
Un esempio potrebbe essere all'interno di una clausola if-else.
Alcuni sviluppatori, però, preferiscono le restituzioni esplicite come scelta di stile.
Chiamare una funzione funziona come in molti altri linguaggi:
squareit(3)
#> [1] 9
Nei prossimi concetti vedremo che il risultato 9 è in realtà un vettore di lunghezza 1, e non un numero scalare.
Da qui l'inclusione di [1] per indicare che questo è l'inizio del vettore.
is.vector(9)
#> [1] TRUE
In R quasi tutto è una qualche forma di vettore!
La console di R mostrerebbe l'esempio qui sopra così:
> squareit(3)
[1] 9
I documenti di questo programma seguono per lo più la convenzione usata in diversi manuali di R: rimuovono il prompt e commentano il risultato. Così è più facile copiare e incollare gli esempi di codice nella console ed eseguirli.