Condizionali if/else in R
Le strutture condizionali permettono di eseguire blocchi di codice diversi in base al verificarsi di determinate condizioni. In R, il costrutto if/else è lo strumento principale per il controllo del flusso, affiancato dalla funzione vettorizzata ifelse() e da switch() per casi multipli.
Il Costrutto if
L’istruzione if esegue un blocco di codice solo se la condizione specificata risulta TRUE:
# if semplice
temperatura <- 35
if (temperatura > 30) {
print("Fa molto caldo!")
}
# [1] "Fa molto caldo!"
# La condizione deve restituire un singolo valore logico
x <- 10
if (x > 0) {
cat("x è positivo:", x, "\n")
}
# x è positivo: 10
if / else
Il blocco else viene eseguito quando la condizione dell’if è FALSE:
voto <- 24
if (voto >= 18) {
print("Esame superato!")
} else {
print("Esame non superato.")
}
# [1] "Esame superato!"
# Esempio con variabile risultato
punteggio <- 45
if (punteggio >= 60) {
risultato <- "Sufficiente"
} else {
risultato <- "Insufficiente"
}
print(risultato)
# [1] "Insufficiente"
else if per Condizioni Multiple
Quando ci sono più condizioni da valutare si usa else if:
voto <- 27
if (voto >= 30) {
giudizio <- "Eccellente"
} else if (voto >= 27) {
giudizio <- "Buono"
} else if (voto >= 24) {
giudizio <- "Discreto"
} else if (voto >= 18) {
giudizio <- "Sufficiente"
} else {
giudizio <- "Insufficiente"
}
print(giudizio)
# [1] "Buono"
Operatori Logici nei Condizionali
Gli operatori logici & (AND), | (OR) e ! (NOT) permettono di combinare condizioni. Nei condizionali if si usano le forme && e || che valutano solo il primo elemento:
eta <- 25
reddito <- 30000
# AND logico: entrambe le condizioni devono essere vere
if (eta >= 18 && reddito >= 20000) {
print("Idoneo al prestito")
}
# [1] "Idoneo al prestito"
# OR logico: almeno una condizione deve essere vera
giorno <- "sabato"
if (giorno == "sabato" || giorno == "domenica") {
print("È weekend!")
}
# [1] "È weekend!"
# NOT logico: inverte la condizione
piove <- FALSE
if (!piove) {
print("Si può uscire senza ombrello")
}
# [1] "Si può uscire senza ombrello"
Condizionali Annidati
È possibile inserire condizionali all’interno di altri condizionali per logiche più complesse:
eta <- 20
studente <- TRUE
if (eta >= 18) {
if (studente) {
prezzo <- 8 # Sconto studente adulto
} else {
prezzo <- 12 # Adulto intero
}
} else {
if (eta >= 6) {
prezzo <- 5 # Bambino
} else {
prezzo <- 0 # Gratuito
}
}
cat("Prezzo del biglietto:", prezzo, "euro\n")
# Prezzo del biglietto: 8 euro
ifelse() Vettorizzato
La funzione ifelse() è la versione vettorizzata del condizionale, ideale per operare su interi vettori senza bisogno di cicli:
# Sintassi: ifelse(condizione, valore_se_vero, valore_se_falso)
voti <- c(28, 15, 22, 30, 17, 19)
esito <- ifelse(voti >= 18, "Superato", "Bocciato")
print(esito)
# [1] "Superato" "Bocciato" "Superato" "Superato" "Bocciato" "Superato"
# ifelse() annidato per categorie multiple
temperature <- c(5, 15, 25, 35, 10, 28)
categoria <- ifelse(temperature >= 30, "Caldo",
ifelse(temperature >= 20, "Mite",
ifelse(temperature >= 10, "Fresco", "Freddo")))
print(categoria)
# [1] "Freddo" "Fresco" "Mite" "Caldo" "Fresco" "Mite"
# Molto utile nei data frame
studenti <- data.frame(nome = c("Anna", "Bruno", "Carla"), voto = c(30, 16, 24))
studenti$esito <- ifelse(studenti$voto >= 18, "Promosso", "Bocciato")
print(studenti)
# nome voto esito
# 1 Anna 30 Promosso
# 2 Bruno 16 Bocciato
# 3 Carla 24 Promosso
switch()
La funzione switch() è utile quando si deve scegliere tra molti valori possibili di una variabile:
# switch() con valori nominati
giorno <- "martedi"
tipo <- switch(giorno,
"lunedi" = "Feriale",
"martedi" = "Feriale",
"mercoledi" = "Feriale",
"giovedi" = "Feriale",
"venerdi" = "Feriale",
"sabato" = "Weekend",
"domenica" = "Weekend",
"Giorno non valido" # valore di default
)
print(tipo)
# [1] "Feriale"
# switch() per selezionare operazioni
operazione <- "media"
valori <- c(10, 20, 30, 40, 50)
risultato <- switch(operazione,
"somma" = sum(valori),
"media" = mean(valori),
"max" = max(valori),
"min" = min(valori)
)
cat("Risultato:", risultato, "\n")
# Risultato: 30
any() e all() per Condizioni su Vettori
Le funzioni any() e all() permettono di verificare condizioni su interi vettori, restituendo un singolo valore logico:
punteggi <- c(72, 85, 91, 68, 55, 88)
# any(): TRUE se almeno un elemento soddisfa la condizione
if (any(punteggi < 60)) {
cat("Attenzione: almeno uno studente è insufficiente\n")
}
# Attenzione: almeno uno studente è insufficiente
# all(): TRUE se tutti gli elementi soddisfano la condizione
if (all(punteggi >= 50)) {
cat("Tutti gli studenti hanno almeno 50 punti\n")
}
# Tutti gli studenti hanno almeno 50 punti
# Combinare any() e all() con condizioni complesse
valori <- c(2, 4, 6, 8, 10)
if (all(valori %% 2 == 0)) {
print("Tutti i valori sono pari")
}
# [1] "Tutti i valori sono pari"
Conclusione
Le strutture condizionali sono essenziali per controllare il flusso di esecuzione in R. Il costrutto if/else if/else è ideale per singole decisioni, mentre ifelse() è lo strumento da preferire quando si lavora con vettori e data frame. La funzione switch() semplifica la gestione di casi multipli, e any() e all() permettono di valutare condizioni su interi vettori in modo efficiente e leggibile.