Questo è un concetto importante in R. Per aiutarti a orientarti tra le possibilità, può essere utile considerare la dimensionalità dell'input e dell'output delle varie funzioni.
Abbiamo già visto funzioni che ricevono in input un vettore e restituiscono un singolo valore simile a uno scalare:
> v <- 1:5
> length(v)
#> [1] 5
> sum(v)
#> [1] 15
Anche molte funzioni statistiche rientrano in questa categoria, come mean().
Per i vettori logici, ci sono all() e any().
Molte funzioni in R operano su interi vettori, spesso restituendo un vettore in output. Questo include la maggior parte delle funzioni matematiche:
> sq <- c(4, 9, 16, 25)
> sqrt(sq) # square root
#> [1] 2 3 4 5
Non è solo conciso e comodo: evita la necessità di cicli, comprensioni di liste o ricorsione, che sono comuni in altri linguaggi. In R, le funzioni vettoriali sono spesso molto più veloci di queste tecniche.
Per ordinare un vettore, ci sono sort(), che restituisce i valori, e order(), che restituisce gli indici:
> v <- c("I", "am", "not", "in", "order")
> sort(v)
#> [1] "am" "I" "in" "not" "order"
> order(v)
#> [1] 2 1 4 3 5
L'impostazione predefinita è l'ordinamento crescente.
Specifica decreasing = TRUE se necessario, oppure usa rev() per invertire un vettore esistente.
v <- c("I", "am", "not", "in", "order")
sort(v, decreasing = TRUE)
#> [1] "order" "not" "in" "I" "am"
rev(1:4)
#> [1] 4 3 2 1
Ci sono anche funzioni che producono output vettoriali cumulativi, operando sul vettore di input da sinistra a destra:
> cumsum(1:5)
#> [1] 1 3 6 10 15 # sums
> cumprod(1:5)
#> [1] 1 2 6 24 120 # equivalent to factorials
Un'estensione di questo concetto può essere usata anche per confrontare i vettori.
Per esempio, considera la funzione di massimo a coppie pmax():
> v
#> [1] 2 7 9
> w
#> [1] 3 1 5
> pmax(v, w)
#> [1] 3 7 9 # max of each pairwise comparison
Sei un appassionato osservatore di uccelli che tiene traccia di quanti uccelli hanno visitato il tuo giardino negli ultimi sette giorni.
Hai sei attività, tutte legate al numero di uccelli che hanno visitato il tuo giardino.
Implementa la funzione today() in modo che restituisca quanti uccelli hanno visitato il tuo giardino oggi. I conteggi degli uccelli sono ordinati per giorno: il primo elemento è il conteggio del giorno più lontano, l'ultimo è il conteggio di oggi.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
today(birds_per_day)
# => 1
Implementa la funzione increment_todays_count() per incrementare il conteggio di oggi:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
increment_todays_count(birds_per_day)
# => c(2, 5, 0, 7, 4, 2)
Implementa la funzione has_day_without_birds() che restituisce TRUE se c'è stato un giorno in cui zero uccelli hanno visitato il giardino; altrimenti restituisce FALSE:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
has_day_without_birds(birds_per_day)
# => true
Implementa la funzione count_for_first_days() che restituisce il numero di uccelli che hanno visitato il tuo giardino dall'inizio della settimana, ma limita il conteggio al numero di giorni specificato dall'inizio della settimana.
birds_per_day <- c(2, 5, 0, 7, 4, 1)
count_for_first_days(birds_per_day, 4)
# => 14
Alcuni giorni sono più intensi di altri. Un giorno intenso è un giorno in cui cinque o più uccelli hanno visitato il tuo giardino.
Implementa la funzione busy_days() in modo che restituisca il numero di giorni intensi:
birds_per_day <- c(2, 5, 0, 7, 4, 1)
busy_days(birds_per_day)
# => 2
Sei curioso di sapere quanti uccelli in totale sono venuti finora questa settimana. Calcola i totali cumulativi per ogni giorno.
running_total(c(7, 6, 5, 4, 3, 2, 1))
#> [1] 7 13 18 22 25 27 28
Supponi che le visite degli uccelli siano influenzate dal traffico stradale nelle vicinanze, che è diverso nei fine settimana rispetto ai giorni feriali.
Ordina le abbreviazioni dei giorni in ordine decrescente rispetto a quanti uccelli sono venuti.
day_names <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
birds_per_day <- c(5, 2, 4, 6, 0, 9, 8)
busy_days_of_week(birds_per_day, day_names)
#> [1] "Sat" "Sun" "Thu" "Mon" "Wed" "Tue" "Fri"
Iscriviti a Exercism per imparare e padroneggiare R con 21 concetti111 esercizi e il mentoring di persone reali, tutto gratis.