# PUNTO 1 ------------------------------------------------
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,NaNeNA) - 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 cartellahw02e 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:
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
Ricordati di utilizzare i commenti per le risposte aperte e di commentare i comandi che restituiscono un errore.
Parte 1: Progetto e workspace
- Stampa sulla console la directory di lavoro corrente e commenta il risultato: a quale cartella corrisponde?
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).
- 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
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
Crea un vettore
xcontenente, nell’ordine, i valori12,NA,7,NaN,15eInf. Stampa a video la modalità e la lunghezza dixPer individuare i valori mancanti di
x, prova prima ad eseguire l’istruzionex == NAe commenta il risultato: perché questo confronto non permette di capire quali elementi sono mancanti? Applica poi axle funzioniis.na,is.naneis.finite. Commenta i tre risultati, soffermandoti in particolare su come vengono trattatiNAeNaN
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.
- Esegui le istruzioni
sum(c(TRUE, FALSE, TRUE, TRUE))eas.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 diis.na(x)per contare quanti valori mancanti sono presenti inx, usando un’unica istruzione e senza contarli “a mano”
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.
Calcola la media di
xconmean(x)e conmean(x, na.rm = TRUE). Commenta i due risultati: perché il secondo non è un numero finito?Calcola la media dei soli valori finiti di
x, usando il risultato diis.finite(x)per il puntamentoEsegui in un’unica istruzione, combinando i risultati con la funzione
c, le operazioni1/0,-1/0,0/0,Inf - Inf,Inf * 0elog(0). Commenta i risultatiEsegui l’istruzione
sqrt(-1)e commenta il risultato
Questo comando restituisce un messaggio di avvertimento
Esegui in un’unica istruzione, combinando i risultati con la funzione
c, i confrontiNA == NA,NA > 1,NA & FALSEeNA | TRUE. Commenta i risultati: perché alcuni confronti restituisconoNAe altri no?Esegui le istruzioni
length(NULL),length(NA)ec(1, NULL, 3). Commenta i risultati, spiegando la differenza traNULLeNAEsegui in sequenza le istruzioni
T,T <- 0,Term(T). Prova poi ad eseguireTRUE <- 0. Commenta i risultati: perché la prima assegnazione va a buon fine e la seconda no?
L’ultimo comando restituisce un errore
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
Esegui le istruzioni
-2^2e(-2)^2e commenta la differenza tra i due risultatiCalcola il quoziente intero e il resto della divisione di
2026per7, usando gli operatori%/%e%%. Verifica poi il risultato ricostruendo2026a partire dal quoziente e dal resto
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.
Crea un vettore
numcon i numeri interi da 1 a 20 ed estrai i soli numeri pari, sfruttando l’operatore%%per il puntamentoEsegui l’istruzione
"10" < "9"e commenta il risultato, anche alla luce di quanto visto nel compito precedente sulla modalitàcharacterCrea 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)
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.
- Esegui le istruzioni
any(voti < 18)eall(voti >= 18)e commenta i risultati
La funzione any restituisce TRUE se almeno un elemento del vettore logico è TRUE; la funzione all restituisce TRUE se tutti gli elementi sono TRUE.
- Esegui le istruzioni
voti > 20 & voti < 28evoti > 20 && voti < 28. Commenta la differenza tra gli operatori&e&&
Il secondo comando restituisce un errore
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
Crea una lista senza nomi
lista_unnamedche contenga, nell’ordine: il vettorevoti, la stringa"Statistical Computing con R"e il valore logicoTRUE. Stampa a video la lista e la sua lunghezzaCrea una lista con nomi
lista_namedcon gli stessi elementi dilista_unnamed, assegnando agli elementi i nomivoti,corsoesuperato. Stampa a video la lista e commenta la differenza rispetto alla stampa del punto 20Stampa a video la struttura di
lista_namedusando la funzionestre commenta brevemente le informazioni restituite
La funzione str (structure) mostra in forma compatta la struttura di un oggetto: tipo, lunghezza e primi valori di ciascun elemento.
Estrai il primo elemento di
lista_namedin 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 (funzioneclass) e commenta le differenzeStampa a video il terzo voto contenuto nell’elemento
votidilista_named, usando un’unica istruzioneProva ad eseguire l’istruzione
lista_named[1][2]e commenta il risultato, confrontandolo con quello del punto 24Aggiungi a
lista_namedun nuovo elemento di nomeannocon valore2026. Elimina poi l’elementosuperatoassegnandogliNULL. Stampa a video i nomi e la lunghezza della lista risultante
Parte 5: Data frame e tibble
Crea un data frame
studenticon le seguenti colonne:nome: Anna, Luca, Sara, Marco, Giuliaeta: 23, 25, 22, 30, 27corso: Statistica, Economia, Statistica, Economia, Statisticavoto: 28, 24, 30,NA, 27
Stampa a video la struttura di
studenticon la funzionestr, il numero di righe e di colonne e i nomi delle colonne
Puoi sfruttare le funzioni nrow, ncol (oppure dim) e names.
- Crea un oggetto
studenti_tbconvertendostudentiin una tibble. Stampa a videostudentiestudenti_tbe commenta le differenze nella visualizzazione
Puoi sfruttare la funzione as_tibble del package tibble. Per usarla senza caricare il package con library puoi scrivere tibble::as_tibble(studenti).
Stampa a video la classe di
studentie distudenti_tbe commenta il risultatoEsegui le istruzioni
studenti[, 4]estudenti_tb[, 4]e commenta la differenza tra i due risultatiEsegui le istruzioni
studenti["voto"],studenti[["voto"]]estudenti$voto. Per ciascuna stampa a video la classe del risultato e commenta: quale regola, vista per le liste, si applica anche ai data frame?Esegui le istruzioni
studenti$votestudenti_tb$vot(con il nome della colonna volutamente incompleto) e commenta la differenza di comportamento
Il secondo comando restituisce un messaggio di avvertimento
Parte 6: Puntamento con condizioni
Stampa a video le righe di
studentirelative agli studenti con voto maggiore o uguale a 27. Commenta il risultato: cosa accade alla riga di Marco?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
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).
Stampa a video il nome e il voto degli studenti del corso di Statistica con più di 22 anni
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
Il voto di Marco, prima mancante, è
26: inseriscilo nel data frame, individuando la riga attraverso il nome dello studente e non la sua posizioneAggiungi a
studentiuna colonna logicalodeche valgaTRUEper gli studenti con voto pari a 30 eFALSEaltrimenti. Stampa a video il data frame risultante
Parte 7: Operatore pipe
Riscrivi l’istruzione
round(mean(sqrt(c(4, 9, 16))), 2)utilizzando la pipe nativa|>. Riscrivila poi utilizzando la pipe%>%del packagemagrittr, dopo aver caricato il package conlibrary(magrittr). Verifica che i risultati coincidanoEsegui le istruzioni
c(4, 9, 16) %>% sqrtec(4, 9, 16) |> sqrte commenta la differenza di comportamento
Il secondo comando restituisce un errore
- Usando la pipe nativa, passa il valore
20come argomentotodella funzioneseq, in modo da ottenere la sequenza da 1 a 20 con passo 5. Fai poi lo stesso con la pipe dimagrittr, passando gli argomenti per posizione. Commenta la differenza tra i due segnaposti
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 ::
Stampa a video la search path con la funzione
search. Carica poi il packagedplyrconlibrary(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 RStudioCommenta il messaggio stampato da R al caricamento di
dplyr. Esegui poi l’istruzionefind("filter")e spiega, alla luce della search path, quale delle due funzionifilterverrebbe usata scrivendo semplicementefilter(...)
La funzione find restituisce i nomi degli ambienti della search path in cui è presente un oggetto con il nome indicato.
- Crea un oggetto
sd <- c(1, 2, 3)ed esegui poi, in sequenza, le istruzionisdesd(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’oggettosddal workspace
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.
- Scrivi l’istruzione che usa esplicitamente la funzione
filterdel packagestatse quella che usa esplicitamente la funzionefilterdel packagedplyr, senza eseguirle (riportale come commento). Spiega in quali situazioni è utile l’operatore::
Parte 9: Salvataggio e caricamento di oggetti
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 commentaSalva solo gli oggetti
studentielista_namedin un filehw02_dati.RDataElimina tutti gli oggetti dal workspace, carica il file
hw02_dati.RDatae stampa a video gli oggetti presenti nel workspace. Commenta il risultatoProva ad eseguire l’istruzione
save(studenti, lista_named, "hw02_dati.RData"), cioè senza specificare il nome dell’argomentofile, e commenta l’errore alla luce delle regole di passaggio degli argomenti
Questo comando restituisce un errore
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.Rsu Teams, in risposta al compito assegnato
Valutazione
Totale punti disponibili: 110 punti
| Component | Punti |
|---|---|
| Es 1 - 50 | 100 |
| Workflow & formattazione | 101 |
Footnotes
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↩︎