Vai al contenuto
eLearner.app
Modulo 3 · Lezione 1 di 25/10 nel corso~12 min
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 <-:

Code
# 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.

Code
# 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:

Code
# 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):

Code
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):

Code
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

Esercizio#r.m3.l1.e1
Tentativi: 0Caricamento…

Definisci una funzione chiamata double_value che accetti un singolo argomento x e restituisca il suo doppio (x * 2) tramite return().

Caricamento editor…
Mostra suggerimento

Usa la sintassi: double_value <- function(x) { return(x * 2) }

Soluzione disponibile dopo 3 tentativi

Esercizio#r.m3.l1.e2
Tentativi: 0Caricamento…

Definisci una funzione chiamata calculate_area che accetti due argomenti: width e height. La funzione deve restituire il loro prodotto tramite return().

Caricamento editor…
Mostra suggerimento

Definisci la funzione con parametri width e height, e restituisci width * height.

Soluzione disponibile dopo 3 tentativi

Esercizio#r.m3.l1.e3
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

Usa: calculate_tax <- function(amount, rate = 0.22) { return(amount * rate) }

Soluzione disponibile dopo 3 tentativi

Esercizio#r.m3.l1.e4
Tentativi: 0Caricamento…

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)).

Caricamento editor…
Mostra suggerimento

Usa la sintassi: analyze_vector <- function(v) { return(list(sum = sum(v), len = length(v))) }

Soluzione disponibile dopo 3 tentativi

Esercizio#r.m3.l1.e5
Tentativi: 0Caricamento…

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.

Caricamento editor…
Mostra suggerimento

Usa: tripled <- sapply(v, function(x) x * 3)

Soluzione disponibile dopo 3 tentativi