Restituire funzioni
Fa parte della sezione Logica e flusso del percorso R di Coddy. Lezione 29 di 64.
Una funzione può anche restituire una funzione. make_multiplier(3) restituisce una nuova funzione che moltiplica il suo argomento per 3:
make_multiplier <- function(n) {
function(x) x * n
}
triple <- make_multiplier(3)
print(triple(5))
print(make_multiplier(10)(5))Output:
[1] 15
[1] 50La funzione restituita ricorda i valori con cui è stata creata. Questa combinazione di una funzione e delle variabili che la circondano è chiamata closure. Ogni chiamata alla funzione generatrice crea una closure separata:
make_greeter <- function(greeting) {
function(name) paste0(greeting, ", ", name, "!")
}
hello <- make_greeter("Hello")
hola <- make_greeter("Hola")
print(hello("Ada"))
print(hola("Ada"))Output:
[1] "Hello, Ada!"
[1] "Hola, Ada!"Una funzione factory trasforma alcune impostazioni in uno strumento pronto all’uso, ad esempio un convertitore tra unità:
make_converter <- function(factor, offset = 0) {
function(x) x * factor + offset
}
c_to_f <- make_converter(1.8, 32)
km_to_miles <- make_converter(0.621)
print(c_to_f(100))
print(km_to_miles(10))Output:
[1] 212
[1] 6.21Le funzioni possono essere combinate in nuove funzioni. compose(f, g) restituisce una funzione che esegue f e poi g:
compose <- function(f, g) function(x) g(f(x))
clean <- compose(trimws, toupper)
print(clean(" hi there "))Output:
[1] "HI THERE"Sfida
FacileCompleta make_formatter(prefix, digits). Restituisce una funzione che prende un numero e restituisce prefix seguito dal numero con digits cifre decimali: make_formatter("$", 2)(3.5) restituisce $3.50.
sprintf("%.*f", digits, x) formatta x con digits cifre decimali.
Il codice fornito legge il prefisso, il numero di cifre decimali e un elenco di numeri separati da virgole. Crea un formatter e ne stampa il risultato per ogni numero.
Provalo tu
make_formatter <- function(prefix, digits) {
# Escribe tu código aquí
function(x) ""
}
# Código de entrada/salida proporcionado: mantenlo tal como está
input <- suppressWarnings(readLines(file("stdin")))
fmt <- make_formatter(input[1], as.integer(input[2]))
for (x in as.numeric(strsplit(input[3], ",")[[1]])) cat(fmt(x), "\n", sep = "")
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