Indice
Sintassi nomi, operazioni elementari.
• case sensitive (nome≠Nome). Le variabili in R sono case-sensitive, pertanto invocare il nome di una di esse con caratteri maiuscoli o minuscoli non è la stessa cosa
• sono ammessi caratteri alfanumerici, più ‘.’ (ma non possono iniziare con numero)
• dichiarazioni non necessarie
• usuali operatori aritmetici: +, -, *, /. Attenzione: l’elevamento a potenza è ^ e non **. Ad esempio, 2^3 corrisponde a 23 .
• operatori logici: ==, >=, <=, !=
• ‘;’ per separare istruzioni su stessa riga
• parentesi graffe { } per raggruppare istruzioni, es. if ( ) { ……}.
Variabili
Tipi booleani
Sono variabili che possono avere solo due valori.
In R i valori si indicano con :
- TRUE oppure T
- FALSE oppure F
- Il comando matrix accetta un parametro booleano……
Vettori e variabili
R permette di lavorare con dati strutturati. I tipi più semplici sono gli scalari e i vettori.
x <- 4; # per assegnare uno scalare a x
x <- c(1,2,3,4,5,6); # per assegnare un vettore tutto quello che c’è dopo il segno # è visto come commento
Il comando c() concatena gli elementi forniti come parametri.
Strutture dati in R
Vettori
I vettori sono sequenze (ordinate) di dati omogenei.
• Ad es., numeri interi, floating point, numeri complessi, booleani, stringhe di caratteri
• Diversamente da Python ̶in cui un vettore può essere creato direttamente con le parentesi quadre ̶ in R bisogna usare la funzione c() seguita dagli elementi separati da virgole
Coercion dei vettori
Quando passiamo alle funzioni (inclusa c()) degli argomenti con tipo di valore sbagliato, R cerca di convertirli affinché le cose vengano sistemate
• Ad es., i tipi di dato nei vettori devono essere tutti uguali. Se proviamo a creare un vettore usando tipi diversi, vengono tutti convertiti per uniformarli
• ATTENZIONE: questo meccanismo, chiamato coercion, è silenzioso. R non ci avvisa che li sta convertendo, né ci dice come li ha convertiti!
Possiamo verificare il tipo di dati di un vettore usando la funzione typeof():
> typeof(A)
“character”
• I vettori sono sempre “piatti”, anche se creiamo vettori nidificati:
A <- c(1, c(2, c(3, 4) ) )
> A
[1] 1 2 3 4
> A <- c(1, 2, 3, 4)
[1] 1 2 3 4
• Questo consente di concatenare due vettori semplicemente creando un nuovo vettore che li contiene entrambi:
A <- c(1,2,3)
> B <- c(4,5,6)
> C <- c(A,B)
C
[1] 1 2 3 4 5 6
Vettori di numeri interi
E’ possibile generare automaticamente un vettore di numeri interi compresi tra m e n con la sintassi m:n:
seq(m,n,q) genera un vettore di numeri interi compresi tra m e n (incluso) con passo q
• Equivalente alla fuzione arange() di numpy
• Se non viene specificato, il passo vale 1
• Se il passo è negativo, la sequenza è decrescente
Vettori di numeri floating point
Utilizzando l’argomento opzionale length.out, seq() genera un vettore di numeri floating point della dimensione desiderata:
Diamo un occhio, in modo più dettagliato alla funzione seq():
seq() genera una sequenza di numeri.
seq(from = 1, to = 1, by = ((to – from)/(length.out – 1)), length.out = NULL, along.with = NULL, …)
• from, to: inizio e fine della sequenza di numeri.
• by: step, o incremento (Default è 1)
• length.out: lunghezza della sequenza ( numero degli elementi)
Esempi:
Generiamo una sequenza da -6 to 7:
> x <- seq(-6,7)
> x
[1] -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7
Da -6 a 7, step=2:
> x <- seq(-6,7,by=2)
> x
[1] -6 -4 -2 0 2 4 6
Proviamo un passo più piccolo:
> x <- seq(-2,2,by=0.3)
> x
[1] -2.0 -1.7 -1.4 -1.1 -0.8 -0.5 -0.2 0.1 0.4
0.7 1.0 1.3 1.6 1.9
Supponiamo di non conoscere lo step, ma vogliamo 10 numeri distribuiti uniformemente da -2 a 2:
seq(-2,2,length.out=10)
[1] -2.0000000 -1.5555556 -1.1111111 -0.6666667 -0.2222222 0.2222222
[7] 0.6666667 1.1111111 1.5555556 2.0000000
Creare un vettore mediante ripetizione
La funzione rep(X,N) consente di generare un nuovo vettore replicando i valori in X esattamente N volte
• X può essere un valore, oppure un vettore a sua volta
Esempi:
rep(1,10)
[1] 1 1 1 1 1 1 1 1 1 1
> rep((1:3), 2)
[1] 1 2 3 1 2 3
> rep( rep(1:3, 2), 2)
[1] 1 2 3 1 2 3 1 2 3 1 2 3
Creazione di un vettore inserito dall’utente
R ha una funzione chiamata scan() che consente di:
1. interrompere l’esecuzione del programma
2. leggere dei valori inseriti dall’utente
3. effettuare la coercion dei valori a un tipo di dato uniforme
4. inserire tutti i dati in un vettore
Scan() sintassi di base:
scan("data.txt", what = "character") |
Esempio 1:
In genere, la funzione scan () viene applicata ai file di testo (ad esempio il formato txt). Creiamo quindi un tale file di testo sul nostro computer:
Innanzitutto, creeremo un frame di dati di esempio in R:
data <- data.frame(x1 = c(4, 4, 1, 9), # Creiamo un data.frame di esempio x2 = c(1, 8, 4, 0), x3 = c(5, 3, 5, 6)) data # visualizziamo # x1 x2 x3 # 4 1 5 # 4 8 3 # 1 4 5 # 9 0 6 |
I nostri dati di esempio contengono tre colonne e quattro righe con valori numerici. Ora, scriviamo questo frame di dati come file txt sul nostro computer:
write.table(data,
file = "data.txt",
row.names = FALSE)
Ora possiamo usare scan() per leggere questo file di testo in R:
data1 <- scan("data.txt", what = "character") # applichiamo scan() data1 # [1] "x1" "x2" "x3" "4" "1" "5" "4" "8" "3" "1" "4" "5" "9" "0" "6" |
Esempio2:
data2 <- scan("data.txt", what = list("", "", "")) data2 # [[1]] # [1] "x1" "4" "4" "1" "9" # # [[2]] # [1] "x2" "1" "8" "4" "0" # # [[3]] # [1] "x3" "5" "3" "5" "6" |
Esempio3:
Scan() fornisce molte specifiche aggiuntive – e una di queste è l’opzione salta (skip). L’opzione skip consente di saltare le prime n righe del file di input. Poiché i nomi delle colonne sono in genere le prime righe di input di un file, possiamo semplicemente saltarli con la specifica skip = 1:
data3 <- scan("data.txt", skip = 1) data3 # [1] 4 1 5 4 8 3 1 4 5 9 0 6 |
Esempio 4:
Possiamo leggere anche altri formati. Nel prossimo esempio creiamo un file .csv:
write.table(data, file = "data.csv", row.names = FALSE) |
Applichiamo la funzione scan() al file creato precedentemente:
data4 <- scan("data.csv", what = "character") # Apply scan function to csv file data4 # Print scan output to RStudio console # [1] "x1" "x2" "x3" "4" "1" "5" "4" "8" "3" "1" "4" "5" "9" "0" "6" |
Esempio 5:
Un’altra utile funzionalità di scan() è la possibilità di leggere l’input dalla console . Per fare ciò, dobbiamo prima eseguire la seguente riga di codice:
data5 <- scan("") |
Assegnazione di valori alle variabili.
esistono sei modi per assegnare dei valori alle variabili.
Ad es., per assegnare il valore 42 alla variabile A:
• Possiamo usare il singolo uguale = (come in Python)
> A = 42
• Il metodo tradizionale è mediante l’operatore “freccia” <- (scorciatoia: ALT + -)
> A <- 42
• Si può anche usare nell’altro verso purché la freccia punti alla variabile
> 42 -> A
Possiamo poi usare la funzione assign(“variabile”, valore)
> assign(“A”, 42)
• Esistono poi le notazioni alternative ->> e <<- che in R sono perfettamente lecite…
Scrivere su un file
• In R possiamo scrivere dei dati di una variabile in un file utilizzando la funzione write(dati, file=”nome_file”)
• dati è un elemento che contiene i dati (ad es., un vettore)
• “nome_file” è il nome del file da creare nella directory corrente
• ATTENZIONE: il nome del file viene passato come argomento mediante l’uguale
> A <- c(1,2,3,4,5)
> write(A, file=”numeri.txt”)
(574)