Leçons du module (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().
Afficher l'indice
Usa la sintassi: double_value <- function(x) { return(x * 2) }
Solution disponible après 3 tentatives
Definisci una funzione chiamata calculate_area che accetti due argomenti: width e height. La funzione deve restituire il loro prodotto tramite return().
Afficher l'indice
Definisci la funzione con parametri width e height, e restituisci width * height.
Solution disponible après 3 tentatives
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.
Afficher l'indice
Usa: calculate_tax <- function(amount, rate = 0.22) { return(amount * rate) }
Solution disponible après 3 tentatives
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)).
Afficher l'indice
Usa la sintassi: analyze_vector <- function(v) { return(list(sum = sum(v), len = length(v))) }
Solution disponible après 3 tentatives
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.
Afficher l'indice
Usa: tripled <- sapply(v, function(x) x * 3)
Solution disponible après 3 tentatives