Passare funzioni
Fa parte della sezione Logica e flusso del percorso R di Coddy. Lezione 28 di 64.
Una funzione può accettare un'altra funzione come argomento e chiamarla. apply_twice() qui sotto funziona con qualsiasi funzione che abbia un argomento:
apply_twice <- function(f, x) f(f(x))
print(apply_twice(\(x) x + 3, 10))
print(apply_twice(toupper, "ok"))Risultato:
[1] 16
[1] "OK"Anche le funzioni integrate come sum, max o toupper sono valori, quindi passale per nome senza parentesi. Con le parentesi verrebbero invece chiamate:
summarize <- function(xs, how) how(xs)
print(summarize(c(4, 9, 2), max))
print(summarize(c(4, 9, 2), sum))Output:
[1] 9
[1] 15Una funzione che accetta un predicato, una funzione che restituisce TRUE o FALSE, può contare o selezionare valori secondo qualsiasi regola:
count_if <- function(xs, keep) {
n <- 0
for (x in xs) if (keep(x)) n <- n + 1
n
}
print(count_if(c(3, 8, 10, 5), \(x) x %% 2 == 0))
print(count_if(c(3, 8, 10, 5), \(x) x > 4))Risultato:
[1] 2
[1] 3Chi chiama decide il comportamento e la funzione fornisce il ciclo, quindi una funzione copre molti casi:
transform_each <- function(xs, f) {
out <- c()
for (x in xs) out <- c(out, f(x))
out
}
print(transform_each(1:4, \(x) x * 10))
print(transform_each(c("a", "b"), toupper))Output:
[1] 10 20 30 40
[1] "A" "B"Sfida
FacileCompleta apply_n(f, x, n). Applica f a x, poi al risultato, per un totale di n volte, e restituisci il valore finale. Quando n è 0, restituisci x senza modificarlo.
Il codice fornito definisce tre funzioni, double, inc e half. Legge il nome di una di esse, il valore iniziale e n, e stampa il risultato di apply_n().
Provalo tu
apply_n <- function(f, x, n) {
# Escribe tu código aquí
x
}
# Código de entrada/salida proporcionado: déjalo tal como está
input <- suppressWarnings(readLines(file("stdin")))
ops <- list(double = \(x) x * 2, inc = \(x) x + 1, half = \(x) x / 2)
cat(apply_n(ops[[input[1]]], as.numeric(input[2]), as.numeric(input[3])), sep = "\n")
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Sottostringhe con substr()Formattazione con sprintf()Dividere e unireRicerca nelle stringheSostituzione del testoRipasso - Generatore di nomi utente4Matrici
Creazione di matriciIndicizzazione delle matriciRiepiloghi di righe e colonneOperazioni aritmetiche con le matriciRipasso - Schema dei posti a sedere10Flusso di controllo avanzato
La funzione switch()ifelse() vettorialerepeat e breakFunzioni ricorsiveRiepilogo - Classificatore di voti2Ricerche chiave-valore
Ricerche in vettori con nomiControllare le chiaviAggiungere e rimuovere chiaviIterare sui nomiRiepilogo - Sportello titoli5Progetto - Registro dei voti
Aggiungere studentiRegistrare i voti8Ordinamento e raggruppamento
Ordinare i vettoriOrdinare in base a una chiaveRaggruppare con split()Riepiloghi dei gruppiRipasso - Classifica3Insiemi e conteggio
Valori univociOperazioni sugli insiemiTest di appartenenzaConteggio con table()Riepilogo - Ospiti dell’evento6Le funzioni come valori
Funzioni anonimePassare funzioniRestituire funzioniClosure con statoRiepilogo - Regole di sconto9DataFrame
Creare DataFrameColonne e righeFiltrare le righeAggiungere e ordinareRiepilogo - Report delle vendite12Progetto - Gestione delle spese
Registrare le speseSpesa totaleEsercitati da solo: Compilatore R online