00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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.