Tracce
/
R
R
/
Programma
/
Condizionali
Co

Condizionali in R

2 esercizi

Informazioni su Condizionali

Operatori di confronto

R ha un insieme di operatori uguale a quello di molti altri linguaggi:

1 == 2 # FALSE
1 != 2 # TRUE
1 < 2 # TRUE
1 > 2 # FALSE
1 <= 2 # TRUE
1 >= 2 # FALSE

Diramazioni

La forma di base di un if-then-else è:

if (x > 10) {
    y <- "big"
} else if (x > 2) {
    y <- "medium"
} else {
    y <- "tiny"
}

In questo caso sono richieste sia le parentesi tonde (( )) attorno al booleano, sia le parentesi graffe ({ }) attorno al corpo.

Una semplice istruzione if può essere abbreviata:

if (x == 0) return("success")

Usare i vettori nei condizionali

Guardando avanti al concetto vector-filtering: la clausola condizionale tra parentesi tonde (()) deve dare come risultato un unico TRUE/FALSE.

Se nel confronto è incluso un vettore, il risultato è di solito un vettore di booleani; in questo caso bisogna racchiuderlo in una funzione di aggregazione come all() (tutti i valori sono TRUE?) o any() (almeno un valore è TRUE?).

numbers <- c(4,5,7,9,10,11)
numbers %% 3 == 0 # gives vector of booleans
#> [1] FALSE FALSE FALSE  TRUE FALSE FALSE

# use any() to get a single TRUE/FALSE
if (any(numbers %% 3 == 0)) print("1 or more numbers are divisible by 3")
#> [1] "1 or more numbers are divisible by 3"

La funzione ifelse

Una forma alternativa di if-else può essere utile, a condizione che ci sia solo un esito vero/falso.

y <- ifelse(x > 8, "big", "small")

# Don't mix result types:
z <- ifelse(x > 100, 100, "small") # numeric or string result? Expect problems!

ifelse() accetta esattamente tre parametri:

  1. una clausola booleana
  2. il valore se TRUE
  3. il valore se FALSE.

Gli input vettoriali sono accettabili e in quel caso si ottiene un output vettoriale. In questo caso, assicurati che entrambi i rami producano lo stesso tipo di dato: numerico, carattere, logico, ecc. Lo affronteremo nel concetto vector-functions.

I due risultati ("big", "small" nell'esempio sopra) dovrebbero essere valori singoli. Purtroppo, se qui si passa un vettore più lungo, R farà probabilmente qualcosa di confuso e inaspettato, senza dare alcun messaggio di avviso.

La funzione if_else

Contesto

Chi mantiene il linguaggio R segue una politica che evita il più possibile modifiche incompatibili. Questo aiuta a mantenere il gran numero di pacchetti di terze parti disponibili su CRAN, ma limita la possibilità di aggiornare R base con concetti di programmazione moderni.

Negli ultimi anni sono stati rilasciati diversi pacchetti che estendono e a volte sostituiscono le funzionalità di R; si basano sull'esperienza pluridecennale maturata sui punti di forza e sulle debolezze del design originale di R.

Questi pacchetti formano la raccolta tidyverse. Sono stati aggiunti al test runner di Exercism nel 2023 e puoi usarli negli esercizi.

Il nostro track R è nato diversi anni prima dell'aggiunta del tidyverse, quindi potresti notare che molte soluzioni della community si attengono al linguaggio base.

Il pacchetto dplyr

dplyr serve soprattutto a manipolare i dataframe (li vedremo più avanti nel corso).

Puoi aggiungerlo con library(dplyr) in cima al codice, oppure con library(tidyverse) per aggiungere l'intera raccolta. Potresti vedere messaggi di avviso sui nomi mascherati, ma raramente è un problema.

Per il concetto attuale vale la pena citare la funzione if_else. È per lo più simile a ifelse di R base.

library(dplyr) # warnings not shown

x <- 10
if_else(x > 8, "big", "small")
#> [1] "big"

La differenza principale è che if_else può accettare un quarto argomento opzionale, per i valori mancanti che in R sono rappresentati da NA.

xs <- c(3, NA, 10, NA, 4)  # a 5-element vector
xs
#> [1]  3 NA 10 NA  4
if_else(xs > 8, "big", "small", "missing")
#> [1] "small"   "missing" "big"     "missing" "small" 

# contrast:
ifelse(xs > 8, "big", "small")
#> [1] "small" NA      "big"   NA      "small"

Potresti anche scoprire che if_else fornisce messaggi di errore molto migliori rispetto al vecchio ifelse.

Dopo aver caricato la libreria dplyr, avrai accesso anche alla funzione between().

R non permette di concatenare i confronti, quindi 1 <= x <= 5 darà un messaggio di errore. Con dplyr caricato, between(x, 1, 5) è equivalente a x >= 1 & x <= 5, e forse più leggibile. Sia il limite inferiore sia quello superiore sono inclusi.

Modifica tramite GitHub Il collegamento si apre in una nuova finestra o scheda

Impara Condizionali