Lezioni del modulo (1/2)
Scrivere Funzioni
In R, le funzioni sono oggetti a tutti gli effetti (first-class citizens) e consentono di strutturare il codice in blocchi modulari, riutilizzabili e ben organizzati.
Definizione di una Funzione
Per definire una funzione si utilizza la parola chiave function e si assegna l'oggetto creato a una variabile (il nome della funzione) tramite l'operatore di assegnamento <-:
# Definizione di una funzione semplice
greet_user <- function() {
print("Hello, User!")
}
# Invocazione della funzione
greet_user()
Parametri e Valori di Ritorno
Le funzioni possono accettare uno o più parametri. Per restituire esplicitamente un valore, si utilizza la funzione return(). Se return() viene omesso, R restituirà automaticamente il valore dell'ultima espressione valutata nel corpo della funzione.
# Funzione che somma due numeri e restituisce il risultato
add_numbers <- function(a, b) {
sum_result <- a + b
return(sum_result)
}
total <- add_numbers(5, 7)
print(total) # Stampa 12
Argomenti Predefiniti (Default)
È possibile specificare valori predefiniti per i parametri di una funzione. Se all'invocazione l'argomento non viene fornito, R utilizzerà il valore di default:
# La funzione usa una percentuale di sconto di default pari al 10% (0.10)
apply_discount <- function(price, discount = 0.10) {
discounted_price <- price * (1 - discount)
return(discounted_price)
}
# Utilizza il default (10%)
print(apply_discount(100)) # Stampa 90
# Specifica uno sconto personalizzato (20%)
print(apply_discount(100, 0.20)) # Stampa 80
Restituire più valori con le Liste
Poiché una funzione in R può restituire direttamente un solo oggetto tramite return(), se abbiamo la necessità di restituire più valori (magari di tipo o lunghezza differenti), possiamo raccoglierli all'interno di una lista (list):
get_stats <- function(v) {
stats <- list(
mean_val = mean(v),
max_val = max(v)
)
return(stats)
}
results <- get_stats(c(10, 20, 30))
print(results$mean_val) # Stampa 20
Funzioni Anonime e sapply
Le funzioni anonime (ovvero funzioni senza nome definte "al volo") sono estremamente utili quando accoppiate con funzioni come sapply() per applicare trasformazioni veloci sugli elementi di un vettore o di una lista.
In R moderno (dalla versione 4.1.0) è possibile definire le funzioni anonime usando la sintassi abbreviata \(x) oltre alla classica function(x):
v <- c(1, 2, 3)
# Uso di sapply con funzione anonima classica
sapply(v, function(x) x^2) # 1 4 9
# Uso di sapply con sintassi abbreviata (R >= 4.1.0)
sapply(v, \(x) x^2) # 1 4 9
Prova tu
Definisci una funzione chiamata double_value che accetti un singolo argomento x e restituisca il suo doppio (x * 2) tramite return().
Mostra suggerimento
Usa la sintassi: double_value <- function(x) { return(x * 2) }
Soluzione disponibile dopo 3 tentativi
Definisci una funzione chiamata calculate_area che accetti due argomenti: width e height. La funzione deve restituire il loro prodotto tramite return().
Mostra suggerimento
Definisci la funzione con parametri width e height, e restituisci width * height.
Soluzione disponibile dopo 3 tentativi
Definisci una funzione chiamata calculate_tax che accetti un argomento obbligatorio amount e un argomento opzionale rate con valore di default 0.22. Restituisci il prodotto amount * rate.
Mostra suggerimento
Usa: calculate_tax <- function(amount, rate = 0.22) { return(amount * rate) }
Soluzione disponibile dopo 3 tentativi
Definisci una funzione chiamata analyze_vector che accetta un vettore v. La funzione deve restituire una lista contenente due elementi chiamati sum (la somma del vettore, calcolata con sum(v)) e len (la lunghezza del vettore, calcolata con length(v)).
Mostra suggerimento
Usa la sintassi: analyze_vector <- function(v) { return(list(sum = sum(v), len = length(v))) }
Soluzione disponibile dopo 3 tentativi
Dato il vettore v, usa la funzione sapply() con una funzione anonima per triplicare il valore di ciascun elemento (moltiplicandolo per 3). Salva il risultato nella variabile tripled.
Mostra suggerimento
Usa: tripled <- sapply(v, function(x) x * 3)
Soluzione disponibile dopo 3 tentativi