HW 02 - Oggetti non atomici, operatori e puntamento

Data di consegna: martedì 06 ottobre 2026

Introduzione

In questo compito utilizzerai i comandi utili per:

  • organizzare il lavoro in un progetto e scrivere uno script R ordinato e commentato
  • riconoscere e gestire i valori riservati (NULL, TRUE/FALSE, Inf, NaN e NA)
  • usare gli operatori aritmetici, relazionali e logici
  • creare e manipolare liste, data frame e tibble
  • puntare agli elementi di un oggetto non atomico per posizione, per nome e attraverso condizioni
  • concatenare operazioni con l’operatore pipe
  • esplorare la search path e accedere agli oggetti di un package con l’operatore ::
  • salvare e ricaricare oggetti R su file

Obiettivi di apprendimento

Lo svolgimento di questo compito ti permetterà di:

  • comprendere la differenza tra oggetti atomici e non atomici
  • scegliere il tipo di puntamento adatto all’oggetto e al risultato che si vuole ottenere
  • comprendere come R tratta i valori mancanti nei calcoli, nei confronti e nel puntamento
  • comprendere come R risolve i nomi degli oggetti
  • lavorare in modo organizzato e riproducibile

Istruzioni per l’uso

  • Crea un progetto RStudio di nome hw02 (in Positron: crea una cartella hw02 e aprila con File → Open Folder) e lavora all’interno del progetto per tutto il compito.

  • Rispondi ai vari punti salvando le risposte in un file R con il nome “hw02_cognome_nome.R”: ad esempio nel mio caso il nome del file sarebbe “hw02_vistocco_domenico.R”. Salva lo script nella cartella del progetto.

  • Inizia lo script con un commento che riporti titolo del compito, nome, cognome e data.

  • Per rispondere ad ogni punto inserisci un’etichetta di sezione (che puoi inserire nello script usando la combinazione di tasti CTRL/CMD + SHIFT + R) utilizzando il punto cui stai rispondendo. Ad esempio, per rispondere al punto 1 del compito, usa un’etichetta di sezione:

    # PUNTO 1 ------------------------------------------------
  • Utilizza i commenti per rispondere alle domande in cui viene chiesta un’interpretazione da parte tua: nei commenti concentrati sul comportamento di R (cosa è successo e perché), con parole tue.

  • Lo script deve essere funzionante quando si eseguono tutti i comandi con il pulsante Source. I comandi che restituiscono un errore vanno quindi lasciati nello script ma commentati (preceduti da #), riportando subito sotto, sempre come commento, il messaggio di errore ottenuto. Ad esempio:

    # "123" + 1
    # Error in "123" + 1 : non-numeric argument to binary operator
    # Commento: ...
  • Rispetta le regole di stile viste in aula: nomi degli oggetti in snake case, <- per l’assegnazione, spazi attorno agli operatori e dopo le virgole, una istruzione per riga.

  • Lo script viene valutato sia in base alla correttezza del codice che in base alla qualità (stile utilizzato per rendere lo script leggibile ed ordinato).

Esercizi

NoteNota

Ricordati di utilizzare i commenti per le risposte aperte e di commentare i comandi che restituiscono un errore.

Parte 1: Progetto e workspace

  1. Stampa sulla console la directory di lavoro corrente e commenta il risultato: a quale cartella corrisponde?
TipSuggerimento

Puoi sfruttare la funzione getwd. Se la directory di lavoro non è la cartella del progetto, verifica di aver aperto il progetto (in RStudio il nome del progetto compare in alto a destra).

  1. Esegui l’istruzione ls() e commenta il risultato. Il workspace dovrebbe essere vuoto: se non lo è, prova a spiegare da dove provengono gli oggetti presenti
TipSuggerimento

Per lavorare in modo riproducibile conviene che ogni sessione parta da un workspace vuoto. In RStudio, da Tools → Global Options → General, togli la spunta a Restore .RData into workspace at startup e imposta Save workspace to .RData on exit su Never.

Parte 2: Valori riservati e valori mancanti

  1. Crea un vettore x contenente, nell’ordine, i valori 12, NA, 7, NaN, 15 e Inf. Stampa a video la modalità e la lunghezza di x

  2. Per individuare i valori mancanti di x, prova prima ad eseguire l’istruzione x == NA e commenta il risultato: perché questo confronto non permette di capire quali elementi sono mancanti? Applica poi a x le funzioni is.na, is.nan e is.finite. Commenta i tre risultati, soffermandoti in particolare su come vengono trattati NA e NaN

TipSuggerimento

NA indica un valore non noto: confrontare un valore con qualcosa di non noto dà un risultato a sua volta non noto, cioè NA. Per verificare se un valore è mancante non si usa quindi l’operatore ==, ma la funzione is.na, che restituisce TRUE per gli elementi mancanti e FALSE per gli altri. La funzione is.nan restituisce TRUE solo per gli elementi NaN, mentre is.finite restituisce TRUE per gli elementi che sono numeri finiti, cioè diversi da NA, NaN, Inf e -Inf.

  1. Esegui le istruzioni sum(c(TRUE, FALSE, TRUE, TRUE)) e as.numeric(c(TRUE, FALSE)) e commenta i risultati: a cosa corrisponde la somma di un vettore di valori logici? Sfrutta poi questa osservazione e il risultato di is.na(x) per contare quanti valori mancanti sono presenti in x, usando un’unica istruzione e senza contarli “a mano”
TipSuggerimento

La funzione as.numeric converte il suo argomento nella modalità numeric: osserva in quali numeri vengono trasformati i valori TRUE e FALSE. La stessa conversione avviene automaticamente quando un vettore logico viene usato in un’operazione aritmetica, come la somma.

  1. Calcola la media di x con mean(x) e con mean(x, na.rm = TRUE). Commenta i due risultati: perché il secondo non è un numero finito?

  2. Calcola la media dei soli valori finiti di x, usando il risultato di is.finite(x) per il puntamento

  3. Esegui in un’unica istruzione, combinando i risultati con la funzione c, le operazioni 1/0, -1/0, 0/0, Inf - Inf, Inf * 0 e log(0). Commenta i risultati

  4. Esegui l’istruzione sqrt(-1) e commenta il risultato

Warning

Questo comando restituisce un messaggio di avvertimento

  1. Esegui in un’unica istruzione, combinando i risultati con la funzione c, i confronti NA == NA, NA > 1, NA & FALSE e NA | TRUE. Commenta i risultati: perché alcuni confronti restituiscono NA e altri no?

  2. Esegui le istruzioni length(NULL), length(NA) e c(1, NULL, 3). Commenta i risultati, spiegando la differenza tra NULL e NA

  3. Esegui in sequenza le istruzioni T, T <- 0, T e rm(T). Prova poi ad eseguire TRUE <- 0. Commenta i risultati: perché la prima assegnazione va a buon fine e la seconda no?

Warning

L’ultimo comando restituisce un errore

TipSuggerimento

T e F sono abbreviazioni di TRUE e FALSE, ma solo TRUE e FALSE sono parole riservate. Per questo motivo nello script è sempre preferibile scrivere TRUE e FALSE per esteso.

Parte 3: Operatori

  1. Esegui le istruzioni -2^2 e (-2)^2 e commenta la differenza tra i due risultati

  2. Calcola il quoziente intero e il resto della divisione di 2026 per 7, usando gli operatori %/% e %%. Verifica poi il risultato ricostruendo 2026 a partire dal quoziente e dal resto

TipSuggerimento

L’operatore %/% esegue la divisione intera: restituisce la parte intera del quoziente, scartando la parte decimale (ad esempio 7 %/% 2 restituisce 3). L’operatore %% (detto modulo) restituisce il resto della divisione intera (ad esempio 7 %% 2 restituisce 1, perché 7 = 3 × 2 + 1). In generale, per due numeri a e b vale sempre la relazione a == b * (a %/% b) + a %% b.

  1. Crea un vettore num con i numeri interi da 1 a 20 ed estrai i soli numeri pari, sfruttando l’operatore %% per il puntamento

  2. Esegui l’istruzione "10" < "9" e commenta il risultato, anche alla luce di quanto visto nel compito precedente sulla modalità character

  3. Crea un vettore voti <- c(18, 30, 25, 27, 22, 30). Usando gli operatori relazionali e logici, e senza contare “a mano”, calcola:

    • quanti voti sono pari a 30
    • la proporzione di voti maggiori o uguali a 25
    • quanti voti sono compresi tra 20 e 28 (estremi inclusi)
TipSuggerimento

Ricorda quanto osservato al punto 5 sulla somma di un vettore logico. Pensa poi a cosa rappresenta la media di un vettore di TRUE e FALSE.

  1. Esegui le istruzioni any(voti < 18) e all(voti >= 18) e commenta i risultati
TipSuggerimento

La funzione any restituisce TRUE se almeno un elemento del vettore logico è TRUE; la funzione all restituisce TRUE se tutti gli elementi sono TRUE.

  1. Esegui le istruzioni voti > 20 & voti < 28 e voti > 20 && voti < 28. Commenta la differenza tra gli operatori & e &&
Warning

Il secondo comando restituisce un errore

TipSuggerimento

Gli operatori && e || lavorano su un singolo valore logico: sono pensati per le condizioni che vedremo nelle strutture di controllo (ad esempio if), mentre & e | lavorano elemento per elemento sui vettori.

Parte 4: Liste

  1. Crea una lista senza nomi lista_unnamed che contenga, nell’ordine: il vettore voti, la stringa "Statistical Computing con R" e il valore logico TRUE. Stampa a video la lista e la sua lunghezza

  2. Crea una lista con nomi lista_named con gli stessi elementi di lista_unnamed, assegnando agli elementi i nomi voti, corso e superato. Stampa a video la lista e commenta la differenza rispetto alla stampa del punto 20

  3. Stampa a video la struttura di lista_named usando la funzione str e commenta brevemente le informazioni restituite

TipSuggerimento

La funzione str (structure) mostra in forma compatta la struttura di un oggetto: tipo, lunghezza e primi valori di ciascun elemento.

  1. Estrai il primo elemento di lista_named in tre modi diversi: con la singola parentesi quadra, con la doppia parentesi quadra e con l’operatore $. Per ciascuno dei tre risultati stampa a video la classe (funzione class) e commenta le differenze

  2. Stampa a video il terzo voto contenuto nell’elemento voti di lista_named, usando un’unica istruzione

  3. Prova ad eseguire l’istruzione lista_named[1][2] e commenta il risultato, confrontandolo con quello del punto 24

  4. Aggiungi a lista_named un nuovo elemento di nome anno con valore 2026. Elimina poi l’elemento superato assegnandogli NULL. Stampa a video i nomi e la lunghezza della lista risultante

Parte 5: Data frame e tibble

  1. Crea un data frame studenti con le seguenti colonne:

    • nome: Anna, Luca, Sara, Marco, Giulia
    • eta: 23, 25, 22, 30, 27
    • corso: Statistica, Economia, Statistica, Economia, Statistica
    • voto: 28, 24, 30, NA, 27
  2. Stampa a video la struttura di studenti con la funzione str, il numero di righe e di colonne e i nomi delle colonne

TipSuggerimento

Puoi sfruttare le funzioni nrow, ncol (oppure dim) e names.

  1. Crea un oggetto studenti_tb convertendo studenti in una tibble. Stampa a video studenti e studenti_tb e commenta le differenze nella visualizzazione
TipSuggerimento

Puoi sfruttare la funzione as_tibble del package tibble. Per usarla senza caricare il package con library puoi scrivere tibble::as_tibble(studenti).

  1. Stampa a video la classe di studenti e di studenti_tb e commenta il risultato

  2. Esegui le istruzioni studenti[, 4] e studenti_tb[, 4] e commenta la differenza tra i due risultati

  3. Esegui le istruzioni studenti["voto"], studenti[["voto"]] e studenti$voto. Per ciascuna stampa a video la classe del risultato e commenta: quale regola, vista per le liste, si applica anche ai data frame?

  4. Esegui le istruzioni studenti$vot e studenti_tb$vot (con il nome della colonna volutamente incompleto) e commenta la differenza di comportamento

Warning

Il secondo comando restituisce un messaggio di avvertimento

Parte 6: Puntamento con condizioni

  1. Stampa a video le righe di studenti relative agli studenti con voto maggiore o uguale a 27. Commenta il risultato: cosa accade alla riga di Marco?

  2. Ripeti l’estrazione del punto 34 in modo da ottenere solo le righe degli studenti con voto effettivamente noto e maggiore o uguale a 27

TipSuggerimento

Puoi procedere in due modi: combinando la condizione sul voto con !is.na(studenti$voto), oppure sfruttando la funzione which, che restituisce le posizioni degli elementi TRUE di un vettore logico (ignorando gli NA).

  1. Stampa a video il nome e il voto degli studenti del corso di Statistica con più di 22 anni

  2. Conta quanti studenti hanno un voto maggiore o uguale a 27. Commenta il risultato che ottieni senza gestire il valore mancante e quello che ottieni gestendolo

  3. Il voto di Marco, prima mancante, è 26: inseriscilo nel data frame, individuando la riga attraverso il nome dello studente e non la sua posizione

  4. Aggiungi a studenti una colonna logica lode che valga TRUE per gli studenti con voto pari a 30 e FALSE altrimenti. Stampa a video il data frame risultante

Parte 7: Operatore pipe

  1. Riscrivi l’istruzione round(mean(sqrt(c(4, 9, 16))), 2) utilizzando la pipe nativa |>. Riscrivila poi utilizzando la pipe %>% del package magrittr, dopo aver caricato il package con library(magrittr). Verifica che i risultati coincidano

  2. Esegui le istruzioni c(4, 9, 16) %>% sqrt e c(4, 9, 16) |> sqrt e commenta la differenza di comportamento

Warning

Il secondo comando restituisce un errore

  1. Usando la pipe nativa, passa il valore 20 come argomento to della funzione seq, in modo da ottenere la sequenza da 1 a 20 con passo 5. Fai poi lo stesso con la pipe di magrittr, passando gli argomenti per posizione. Commenta la differenza tra i due segnaposti
TipSuggerimento

Per default la pipe passa il valore a sinistra come primo argomento della funzione. Per passarlo in un’altra posizione si usa un segnaposto: _ per la pipe nativa (che va sempre passato per nome, ad esempio to = _) e . per la pipe di magrittr.

Parte 8: Search path e operatore ::

  1. Stampa a video la search path con la funzione search. Carica poi il package dplyr con library(dplyr), stampa di nuovo la search path e commenta: in quale posizione è stato inserito il nuovo package? Confronta il risultato con il menu a tendina Global Environment del pannello Environment di RStudio

  2. Commenta il messaggio stampato da R al caricamento di dplyr. Esegui poi l’istruzione find("filter") e spiega, alla luce della search path, quale delle due funzioni filter verrebbe usata scrivendo semplicemente filter(...)

TipSuggerimento

La funzione find restituisce i nomi degli ambienti della search path in cui è presente un oggetto con il nome indicato.

  1. Crea un oggetto sd <- c(1, 2, 3) ed esegui poi, in sequenza, le istruzioni sd e sd(voti). Commenta i due risultati alla luce della regola di ricerca dei nomi lungo la search path: in quale ambiente R ha trovato l’oggetto restituito dalla prima istruzione? E quello usato dalla seconda? Al termine cancella l’oggetto sd dal workspace
TipSuggerimento

La regola “R restituisce il primo oggetto trovato lungo la search path” ha una precisazione: quando un nome è seguito dalle parentesi tonde, cioè è usato per chiamare una funzione, R cerca il primo oggetto con quel nome che sia una funzione, saltando quelli che non lo sono. Puoi verificare in quali ambienti esiste un oggetto di nome sd con l’istruzione find("sd"). Anche se R riesce a distinguere i due casi, è buona pratica non dare ai propri oggetti il nome di funzioni esistenti.

  1. Scrivi l’istruzione che usa esplicitamente la funzione filter del package stats e quella che usa esplicitamente la funzione filter del package dplyr, senza eseguirle (riportale come commento). Spiega in quali situazioni è utile l’operatore ::

Parte 9: Salvataggio e caricamento di oggetti

  1. Salva l’intero workspace in un file hw02_tutto.RData, usando un percorso relativo (cioè solo il nome del file). Verifica nel pannello Files in quale cartella è stato creato il file e commenta

  2. Salva solo gli oggetti studenti e lista_named in un file hw02_dati.RData

  3. Elimina tutti gli oggetti dal workspace, carica il file hw02_dati.RData e stampa a video gli oggetti presenti nel workspace. Commenta il risultato

  4. Prova ad eseguire l’istruzione save(studenti, lista_named, "hw02_dati.RData"), cioè senza specificare il nome dell’argomento file, e commenta l’errore alla luce delle regole di passaggio degli argomenti

Warning

Questo comando restituisce un errore

TipSuggerimento

Consulta la sezione Usage della pagina di help di save: cosa rappresenta l’argomento ...?

Consegna

Per inviare la tua soluzione:

  • Carica il file hw02_cognome_nome.R su Teams, in risposta al compito assegnato

Valutazione

Totale punti disponibili: 110 punti

Component Punti
Es 1 - 50 100
Workflow & formattazione 101

Footnotes

  1. La valutazione al “Workflow & formattazione” tiene conto del rispetto delle regole di stile e del principio di riproducibilità del codice: lo script caricato deve funzionare senza errori su qualunque PC, eseguendolo con Source in una sessione con workspace vuoto, dando gli stessi risultati↩︎