Vai al contenuto principale

Tutorial su condizionali e flusso di controllo in R

Scopri gli operatori relazionali per confrontare oggetti R e gli operatori logici per combinare i valori booleani TRUE e FALSE. Costruirai anche istruzioni condizionali.
· 13 min leggi

Scopri con l'IA

Diagramma di flusso delle istruzioni di controllo del flusso
Flusso di controllo (Fonte: w3schools)

Operatori relazionali

Gli operatori relazionali, noti anche come comparators, ti aiutano a vedere come un oggetto R è in relazione a un altro oggetto R. Per esempio, puoi verificare se due oggetti sono uguali o no, cosa che si può fare con il segno == (doppio uguale). Un operatore logico che è TRUE su entrambi i lati restituirà un valore logico TRUE, dato che TRUE è uguale a TRUE, come mostrato di seguito.

TRUE == TRUE
TRUE

Tuttavia, se hai TRUE da un lato e FALSE dall'altro, otterrai come output il valore logico FALSE.

TRUE == FALSE
FALSE

Oltre alle variabili logiche, puoi verificare l'uguaglianza di altri tipi.

Confrontiamo stringhe e numeri.

100 == 100
TRUE
100 == 200
FALSE
'tutorial' == 'R'
FALSE
  • Il contrario dell'operatore di uguaglianza è l'operatore di disuguaglianza, indicato dal segno !- (una combinazione di punto esclamativo seguito da uguale).

Ora tutte le condizioni che prima restituivano FALSE diventeranno TRUE, diamo un'occhiata!

100 != 200
TRUE
'tutorial' != 'R'
TRUE
TRUE != FALSE
TRUE

Allo stesso modo, l'operatore di disuguaglianza può essere usato anche per valori numerici e altri oggetti R come matrici, vettori e liste.

  • E se vuoi controllare, dati due oggetti R, quale dei due è maggiore o minore dell'altro? Certo che puoi, usando i semplici segni < e > (minore di e maggiore di).

    Vediamo prima un esempio numerico.

2 > 10
FALSE
-200 < 0
TRUE

Come vedi, è autoesplicativo perché 2 non è maggiore di 10 o perché -200 è minore di 0. Ma che dire delle stringhe o dei caratteri? Vediamo come si può fare.

Sembra che R dia priorità all'ordine alfabetico quando decide quale stringa o carattere è maggiore dell'altro.

Nell'esempio qui sotto, dato che t viene dopo R in ordine alfabetico, t è maggiore di R.

'tutorial' > 'RRRRRRRRR'
TRUE

È importante notare che in R e in quasi tutti i linguaggi di programmazione, TRUE è interpretato numericamente come 1 e FALSE come 0. Quindi, in base a questa analogia, TRUE sarà maggiore di FALSE.

TRUE > FALSE
TRUE
  • Puoi anche verificare se un oggetto R è maggiore o uguale a (>=) (o minore o uguale a <=) a un altro oggetto R. Per farlo, puoi usare il segno di maggiore/minore in combinazione con il segno di uguale. Questo significa che se una delle due condizioni (minore o uguale / maggiore o uguale) è TRUE, allora l'intera condizione sarà TRUE.
5 >= 5 # 5 non è maggiore di 5 ma è uguale, quindi restituisce TRUE.
TRUE
5 >= 10
FALSE

Puoi imparare i tipi di dato di R in questo tutorial di DataCamp. Mostra che R gestisce molto bene liste, matrici e vettori.

Quindi i comparatori di R sanno gestire i vettori R? Scopriamolo.

Per esempio, hai un vettore riga che registra il numero di visualizzazioni ottenute sul tuo recente tutorial di datacamp negli ultimi 10 giorni. Ora vuoi sapere in quali giorni hai ricevuto almeno 100 visualizzazioni. Puoi usare direttamente il segno di maggiore o uguale.

datacamp_views <- c(100,20,5,200,60,88,190,33,290,64)
length(datacamp_views)
10
datacamp_views >= 100
  1. TRUE
  2. FALSE
  3. FALSE
  4. TRUE
  5. FALSE
  6. FALSE
  7. TRUE
  8. FALSE
  9. TRUE
  10. FALSE

Come puoi vedere dall'output sopra, per il primo, il quarto, il settimo e il nono giorno i risultati sono TRUE: in quei giorni le visualizzazioni erano maggiori o uguali a 100.

Allo stesso modo, puoi anche confrontare due vettori o anche due matrici.

youtube_views <- c(10,20,1000,64,100,9,19,3,90,4)

In questo modo, puoi costruire una piccola applicazione per scoprire quando le visualizzazioni del tuo tutorial su datacamp sono state maggiori di quelle del tuo video su youtube o viceversa.

In R questo funziona confrontando i due vettori elemento per elemento. Per esempio, nell'output qui sotto, se consideri il primo elemento di entrambi i vettori, vedi che il vettore delle visualizzazioni su DataCamp ha valore 100, mentre l'altro vettore ha valore 10, e quindi restituisce TRUE.

datacamp_views > youtube_views
  1. TRUE
  2. FALSE
  3. FALSE
  4. TRUE
  5. FALSE
  6. TRUE
  7. TRUE
  8. TRUE
  9. TRUE
  10. TRUE

Confrontiamo rapidamente due espressioni numeriche. Se ricordi la matematica di base, c'è una regola nota come BODMAS (o PEMDAS), ossia parentesi, divisione, moltiplicazione, addizione e sottrazione, in base alla quale si risolve qualsiasi equazione matematica. Userai la stessa regola per risolvere le due espressioni R qui sotto.

-6 * 5 + 2 >= -10 + 1 # a sinistra si fa prima la moltiplicazione e poi l'addizione secondo BODMAS
FALSE

Confrontare matrici

La capacità di R di gestire diverse strutture dati nei confronti non si ferma ai vettori. Matrici e operatori relazionali funzionano insieme senza problemi!

Invece dei vettori (come nell'esempio precedente), i dati di DataCamp e YouTube sono ora memorizzati in una matrice chiamata views. La prima riga contiene le informazioni di DataCamp; la seconda riga quelle di YouTube. Userai la funzione matrix integrata in R per creare una matrice con l'aiuto dei vettori datacamp e youtube creati nell'esempio precedente.

datacamp_views <- c(100,20,5,200,60,88,190,33,290,64)
youtube_views <- c(10,20,1000,64,100,9,19,3,90,4)
views <- matrix(c(datacamp_views, youtube_views), nrow = 2, byrow = TRUE)
views
Una matrice: 2 × 10 di tipo dbl
10020520060881903329064
10201000641009193904

Scopriamo quando le visualizzazioni sia di datacamp che di youtube sono state uguali a 20.

views == 20
Una matrice: 2 × 10 di tipo lgl
FALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE
FALSETRUEFALSEFALSEFALSEFALSEFALSEFALSEFALSEFALSE

Ottimo! Hai capito come funzionano gli operatori relazionali, ora passiamo agli operatori logici.

Operatori logici

R ti aiuta a combinare i risultati degli operatori relazionali fornendoti i seguenti operatori logici:

  • Operatore AND ( & )
  • Operatore OR ( | )
  • Operatore NOT ( ! )

Diamo un'occhiata a ciascuno di loro.

  • Operatore AND: Come in qualsiasi altro linguaggio di programmazione, l'operatore AND di R prende due valori logici e restituisce TRUE solo e soltanto se entrambi risultano veri, altrimenti restituisce false.
Tavola di verità dell'operatore AND
Tavola di verità dell'operatore AND

Vediamo alcuni esempi autoesplicativi.
TRUE & TRUE # 1.1 = 1
TRUE
TRUE & FALSE # 1.0 = 0
FALSE
FALSE & FALSE # 0.0 = 0
FALSE
FALSE & TRUE # 0.1 = 0
FALSE

Allo stesso modo, invece di usare valori logici come sopra, puoi usare i risultati dei comparatori con questi operatori.

x <- 100
x < 200 & x >= 100  # dato che x è minore di 200 ma maggiore o uguale a 100, restituisce TRUE.
TRUE
x < 200 & x > 100 # questo è FALSE perché il secondo confronto, cioè x maggiore di 100, è falso.
FALSE
  • Operatore OR: L'operatore OR è piuttosto simile all'AND. Tuttavia, la differenza principale è che qui l'espressione OR complessiva è TRUE se almeno uno dei valori logici usati è TRUE.
Tavola di verità dell'operatore OR
Tavola di verità dell'operatore OR

Vediamo alcuni esempi autoesplicativi.
TRUE | TRUE # 1 + 1 = 1
TRUE
TRUE | FALSE # 1 + 0 = 0
TRUE
FALSE | FALSE # 0 + 0 = 0
FALSE
FALSE | TRUE # 0 + 1 = 0
TRUE

Usiamo lo stesso esempio numerico di sopra, ma questa volta il risultato dovrebbe essere diverso.

x <- 100
x < 200 | x > 100 # questo è TRUE perché il primo confronto, cioè x minore di 100, è True.
TRUE
  • Operatore NOT: È l'operatore più semplice da capire: nega semplicemente l'operatore logico a cui è applicato, o puoi pensarci come al contrario dell'operatore logico.
Tavola di verità dell'operatore NOT
Tavola di verità dell'operatore NOT

Vediamo qualche esempio!

a = 1
!a # questo restituisce false perché il not di a sarà 0, che è FALSE.
FALSE
a = 0
!a # simile all'esempio sopra, questo restituisce TRUE perché a = 0 e il not di a è 1.
TRUE

Vediamo alcuni casi in cui l'operatore NOT può essere utile quando si usano funzioni integrate di R.

is.numeric(5) # restituisce TRUE perché 5 è numerico
TRUE
!is.numeric(5) # il not dello stesso restituirà FALSE
FALSE
is.numeric('aditya')
FALSE

L'esempio seguente può essere utile quando stai gestendo un mix di dati numerici e stringhe e vuoi filtrare le stringhe/caratteri, per esempio da una lista, e tenere solo i dati numerici.

!is.numeric('aditya')
TRUE

Infine, vediamo come funzionano gli operatori logici su vettori e matrici.

a <- c(FALSE, TRUE, FALSE)
b <- c(TRUE, TRUE, FALSE)
a & b # operatore AND
  1. FALSE
  2. TRUE
  3. FALSE
a | b # operatore OR
  1. TRUE
  2. TRUE
  3. FALSE

Dai due output sopra, è evidente che, come per i vettori con gli operatori relazionali, anche gli operatori logici operano elemento per elemento.

Tuttavia, l'operatore NOT può essere applicato solo a un singolo vettore alla volta o magari al risultato di due vettori.

!a
  1. TRUE
  2. FALSE
  3. TRUE
!b
  1. FALSE
  2. FALSE
  3. TRUE

Nell'esempio seguente, l'operatore NOT è all'esterno delle parentesi, il che significa che è applicato al risultato di a e b. L'operatore qui sotto può anche essere definito come operatore NOR (Not-OR).

!(a | b) # operatore NOR
  1. FALSE
  2. FALSE
  3. TRUE

Prima di passare alle istruzioni condizionali, facciamo un piccolo esercizio.

Hai lo stesso vettore con le visualizzazioni del tutorial di datacamp definito sopra. Estraiamo l'ultimo elemento usando il metodo tail di R.

last <- tail(datacamp_views,1)
print (last)
[1] 64

Vediamo se l'ultimo elemento è sotto 100 o sopra 100.

last < 100 | last > 100
TRUE

Poiché l'ultimo elemento è sotto 100, una delle espressioni è soddisfatta e quindi restituisce TRUE.

Passiamo all'ultimo argomento di questo tutorial, cioè le istruzioni condizionali!

Istruzioni condizionali

Finora, hai già imparato gli operatori relazionali, che ti dicono come gli oggetti R si relazionano tra loro, e gli operatori logici, che ti permettono di combinare valori logici. R ti offre un modo per combinare tutti questi operatori e usare il risultato per cambiare il comportamento dei tuoi script R. Con questo, entriamo nelle istruzioni if ed else.

La sintassi della condizione if è definita qui sotto: if(condition){ // expression } L'istruzione if prende in input una condizione (tra parentesi tonde) che puoi collegare a un operatore relazionale o logico e, se tale condizione è TRUE, il codice R associato alla condizione (tra parentesi graffe) viene eseguito. Semplice, no?

Capciamolo con un esempio.

Supponi di avere una variabile x uguale a -10; ora imposti una condizione che verifica se x è maggiore di zero e la neghi con un operatore NOT. Poiché la condizione è TRUE, il codice R tra le parentesi graffe verrà eseguito.

x <- -10
if (!x > 0){
    print("x is a negative number")
}
[1] "x is a negative number"

Tuttavia, se rimuovi l'operatore NOT, la condizione diventerà FALSE e il codice tra le parentesi graffe non verrà eseguito.

if (x > 0){
    print("x is a positive number")
}

Ora capiamo l'istruzione else con l'aiuto di una sintassi. if(condition){ // expression1 }else{ // expression2 } A differenza dell'istruzione if, l'istruzione else non richiede una condizione esplicita: deve essere usata in combinazione con if. Il codice R associato a else viene eseguito solo se la condizione dell'istruzione if` non è TRUE.

Prendiamo lo stesso esempio con if per capire else.

x <- -10
if (x > 0){
    print("x is a positive number")
}else{
    print("x is a negative number")
}
[1] "x is a negative number"

Nell'esempio sopra, dato che l'istruzione if non era valida, è stata eseguita l'istruzione else.

Analogamente a if ed else, esiste l'istruzione else if, che si colloca tra if ed else. Viene eseguita quando la condizione dell'if non è soddisfatta. In breve, l'istruzione else ha l'ultima priorità. if(condition){ // expression1 }else if(condition){ // expression2 }else{ // expression3 }

x <- 0
if (x > 0){
    print("x is a positive number")
}else if (x == 0){
    print("x is zero")
}else{
    print("x is a negative number")
}
[1] "x is zero"

Uno dei motivi principali per cui usiamo l'istruzione else if è quando le condizioni in gioco non sono mutuamente esclusive, cioè potrebbero verificarsi contemporaneamente. Vediamolo con un esempio.

x <- 12
if (x %% 3 == 0){
    print("x is divisible by 3")
}else if (x %% 4 == 0){
    print("x is divisible by 4")
}else{
    print("x is neither divisible by 3 nor by 4")
}
[1] "x is divisible by 3"

Nell'esempio sopra, la condizione if è risultata TRUE, quindi R è uscito dalla struttura di controllo e non è passato alle istruzioni successive anche se la condizione else if sarebbe stata TRUE: non l'ha eseguita. Tuttavia, invece di else if, se avessi usato un altro if, allora anche quello sarebbe stato eseguito.

Conclusione

Congratulazioni per aver terminato il tutorial.

Questo tutorial è stato un buon punto di partenza per chi è curioso di imparare il linguaggio R. Come buon esercizio, potresti applicare gli operatori relazionali e logici come condizioni nelle istruzioni condizionali.

Ci sono ancora argomenti da trattare in R, come le utility in R e il machine learning con R, che saranno affrontati in futuri tutorial, quindi resta sintonizzato!

Per qualsiasi domanda relativa a questo tutorial, sentiti libero di scriverla nei commenti qui sotto.

Se vuoi imparare di più su R, segui il corso Intermediate R di DataCamp.

Argomenti

Correlato