Qual è la relazione corretta tra R, RStudio e Positron?
R è il linguaggio (e l'interprete) che valuta le espressioni. RStudio e Positron sono IDE sviluppati da Posit: offrono un editor per gli script, la console, la visualizzazione del workspace, dei grafici e dell'help, ma per eseguire il codice si appoggiano a un'installazione di R, che va quindi installata separatamente.
La seconda opzione confonde gli ambienti di sviluppo con il linguaggio: in RStudio e in Positron si scrive codice R. La terza è l'errore più frequente al momento dell'installazione: senza R installato nessuno dei due IDE è in grado di eseguire codice R. La quarta è del tutto errata: R è software libero e gratuito, distribuito tramite CRAN.
Che cos'è Positron?
Positron è un IDE sviluppato da Posit (la stessa azienda di RStudio). È costruito su Code OSS, la base open source di Visual Studio Code, ed è pensato per il lavoro di data science in più linguaggi, in particolare R e Python.
La seconda opzione confonde l'IDE con il linguaggio: Positron non è una versione di R e richiede che R sia installato. La terza è parzialmente vera (Positron è di Posit e supporta Python) ma errata sul punto essenziale: Positron supporta anche R. La quarta non ha alcuna relazione con Positron.
Si dice che R è un linguaggio di tipo espressione. Che cosa significa?
In R ogni comando è un'espressione: R la valuta e ne produce un
valore. Se l'espressione non è un'assegnazione, il valore viene stampato
in console (ad esempio 3 + 4 stampa [1] 7); se
è un'assegnazione (x <- 3 + 4), il valore viene
memorizzato nell'oggetto e non viene stampato.
La seconda opzione riduce R a una calcolatrice: le espressioni
possono riguardare dati di qualunque tipo, testo, grafici, modelli. La
terza è in parte vera, ma sbaglia sulle assegnazioni:
x <- 3 + 4 non stampa nulla (a meno di racchiudere
l'espressione tra parentesi tonde). La quarta descrive i linguaggi
compilati: R è interpretato e valuta le espressioni una alla volta.
R è un linguaggio funzionale. Quale delle seguenti affermazioni descrive meglio questa caratteristica?
Nella visione di John Chambers, in R "tutto ciò che esiste è un
oggetto e tutto ciò che accade è una chiamata di funzione". Anche gli
operatori sono funzioni: 2 + 3 equivale a
`+`(2, 3), che restituisce 5. Lo stesso vale
per <-, [ e molti altri simboli.
La seconda opzione restringe arbitrariamente il concetto alle funzioni matematiche. La terza è il fraintendimento più naturale: gli operatori sembrano simboli speciali, ma dietro ciascuno di essi c'è una funzione. La quarta descrive una convenzione di altri linguaggi (C, Java) che non esiste in R.
R è un linguaggio orientato agli oggetti. Che cosa si intende per oggetto in R?
In R tutto ciò che esiste è un oggetto: un vettore di numeri, una
matrice, il risultato di un modello e anche una funzione come
mean. Scrivendo mean senza parentesi, infatti,
R mostra il contenuto dell'oggetto funzione invece di eseguirlo.
La seconda opzione inventa una funzione che non esiste. La terza è l'errore più plausibile: le funzioni sono oggetti a tutti gli effetti, possono essere assegnate, passate come argomenti ad altre funzioni e restituite. La quarta confonde gli oggetti che vivono nella memoria della sessione di R con i file sul disco.
Si digita in console la seguente istruzione:
x <- 3 + 4
Che cosa succede?
L'espressione a destra di <- viene valutata
(3 + 4 dà 7) e il risultato viene assegnato
all'oggetto x. Un'assegnazione non stampa il risultato; per
vederlo basta digitare x oppure racchiudere l'assegnazione
tra parentesi: (x <- 3 + 4).
La seconda opzione corrisponde a ciò che accadrebbe scrivendo
x < -3 + 4 (con uno spazio tra < e
-): l'operatore di assegnazione <- va
scritto senza spazi al suo interno. La terza è il fraintendimento più
comune: l'assegnazione non produce output. La quarta è errata:
l'assegnazione crea l'oggetto se non esiste già.
Quale dei seguenti è un nome valido per un oggetto R (utilizzabile senza ricorrere agli apici inversi)?
Un nome valido può contenere lettere, cifre, il punto .
e il trattino basso _; deve iniziare con una lettera oppure
con un punto non seguito da una cifra, e non può coincidere con una
parola riservata (come if, for,
TRUE). voti.media_2 rispetta tutte le
regole.
voti-media non è valido: il trattino viene interpretato
come l'operatore di sottrazione, quindi R cercherebbe di calcolare
voti meno media. .2voti è il caso
più insidioso: un nome può iniziare con un punto, ma il punto non può
essere seguito da una cifra (R lo leggerebbe come il numero
.2). 3 voti viola due regole insieme: inizia
con una cifra e contiene uno spazio.
Si eseguono in sequenza le seguenti istruzioni:
Eta <- 30
eta
Che cosa restituisce R?
R distingue tra lettere maiuscole e minuscole (è case
sensitive): Eta ed eta sono due nomi
diversi. È stato creato solo l'oggetto Eta, quindi la
richiesta di eta produce l'errore "oggetto 'eta' non
trovato".
La seconda opzione suppone che l'oggetto esista, cosa che non è vera. La terza è l'errore tipico di chi è abituato a software che non distinguono maiuscole e minuscole. La quarta attribuisce a R una correzione automatica che non esiste.
La funzione seq() ha, tra gli altri, gli argomenti
from, to e by, in quest'ordine.
Quale delle seguenti chiamate produce lo stesso risultato di
seq(from = 1, to = 10, by = 3)
cioè il vettore 1 4 7 10?
Nel passaggio misto R abbina prima gli argomenti passati per nome
(by = 3) e poi assegna quelli senza nome, per posizione,
agli argomenti rimasti liberi nell'ordine della definizione:
1 va a from e 10 va a
to. Il risultato è 1 4 7 10.
seq(1, 10) non specifica by, che vale 1 per
default: restituisce i numeri da 1 a 10. seq(3, 1, 10) è
l'errore di chi pensa che l'ordine non conti anche senza nomi: per
posizione diventa from = 3, to = 1,
by = 10 e R restituisce un errore (segno di by
incompatibile con l'intervallo). seq[1, 10, 3] usa le
parentesi quadre, che servono per l'indicizzazione e non per chiamare
una funzione.
La funzione round() ha due argomenti: x (il
numero da arrotondare) e digits (il numero di cifre
decimali). Che cosa restituisce la chiamata seguente?
round(digits = 1, 2.678)
L'argomento digits è passato per nome; il valore senza
nome 2.678 viene assegnato per posizione al primo argomento
rimasto libero, cioè x. La chiamata equivale quindi a
round(x = 2.678, digits = 1) e restituisce
2.7.
3 è il risultato che si otterrebbe ignorando
digits (che per default vale 0). La terza opzione descrive
una regola che vale in altri linguaggi (ad esempio Python) ma non in R:
gli argomenti con nome possono comparire in qualunque punto della
chiamata. La quarta tratta la funzione come se restituisse semplicemente
gli argomenti ricevuti.
Come è rappresentata internamente una matrice in R?
Una matrice è un vettore atomico, quindi con elementi tutti dello
stesso tipo, dotato dell'attributo dim. Ad esempio
attributes(matrix(1:6, nrow = 2)) restituisce
$dim pari a 2 3. Allo stesso modo un array è
un vettore con un attributo dim di lunghezza maggiore di
2.
La seconda opzione descrive un data frame, non una matrice: gli oggetti atomici non ammettono elementi di tipo diverso. La terza è un'immagine intuitiva ma errata: i valori sono memorizzati in un unico vettore, riempito per colonna. La quarta confonde l'oggetto con una sua possibile rappresentazione grafica.
Che cosa restituisce la seguente istruzione?
length(matrix(1:6, nrow = 2))
La lunghezza di un oggetto atomico è il numero complessivo dei suoi
elementi. Una matrice è un vettore con attributo dim,
quindi la sua lunghezza è il numero totale di celle: 2 righe per 3
colonne, cioè 6. Per conoscere righe e colonne si usano
dim(), nrow() e ncol().
3 è il numero di colonne e 2 il numero di
righe: la risposta 2 è la più insidiosa perché
nrow = 2 compare esplicitamente nella chiamata.
21 è la somma degli elementi, che si otterrebbe con
sum(), non con length().
Che cosa restituisce la seguente istruzione?
mode(c(1, "due", 3))
Un vettore è un oggetto atomico: tutti i suoi elementi devono avere
la stessa modalità. Quando si combinano numeri e stringhe, R converte
tutti gli elementi nella modalità più generale, cioè
character: il vettore diventa
"1" "due" "3".
La modalità "mixed" non esiste, proprio perché i vettori
non possono essere misti. "numeric" è la risposta di chi
guarda la maggioranza degli elementi: due su tre sono numeri, ma basta
un solo elemento di tipo carattere per rendere carattere l'intero
vettore. 3 è la lunghezza del vettore, che si otterrebbe
con length().
Si eseguono in sequenza le seguenti istruzioni:
x <- "123"
x + 1
Che cosa restituisce R?
Le virgolette rendono x un oggetto di modalità
character: "123" è una stringa di testo, non
il numero 123. L'operatore + richiede argomenti numerici,
quindi R restituisce l'errore
non-numeric argument to binary operator. Per ottenere 124
bisognerebbe convertire esplicitamente la stringa con
as.numeric(x) + 1.
La seconda opzione applica a R il comportamento di altri linguaggi in
cui + concatena le stringhe; in R la concatenazione si fa
con paste(). La terza è l'errore più plausibile: R non
converte automaticamente le stringhe in numeri nelle operazioni
aritmetiche. La quarta confonde il nome dell'oggetto con il suo
contenuto.
Che cosa restituisce la seguente istruzione?
length("statistica")
"statistica" è un vettore di modalità
character con un solo elemento: la stringa intera.
length() conta gli elementi del vettore, non i caratteri
della stringa, quindi restituisce 1. Per contare i caratteri si usa
nchar("statistica"), che restituisce 10.
0 sarebbe la lunghezza di un vettore vuoto.
10 è la risposta più naturale per chi pensa alla stringa
come a una sequenza di lettere, ma corrisponde a nchar(),
non a length(). "s" confonde la lunghezza con
il primo carattere.
Si eseguono in sequenza le seguenti istruzioni:
x <- c(3, 7, 1)
names(x) <- c("a", "b", "c")
attributes(x)
Che cosa restituisce l'ultima istruzione?
I nomi assegnati con names() sono un attributo del
vettore, cioè un'informazione aggiuntiva che non modifica i valori
3 7 1. attributes(x) elenca solo gli attributi
presenti, quindi restituisce $names con
"a" "b" "c".
La seconda opzione nega che i nomi siano un attributo:
NULL si otterrebbe prima dell'assegnazione dei nomi. La
terza è la più insidiosa: modalità e lunghezza sono proprietà
intrinseche di ogni oggetto (si leggono con mode() e
length()), non attributi, e non compaiono in
attributes(). La quarta restituisce i valori del vettore
anziché i suoi attributi.
Quale istruzione cancella tutti gli oggetti presenti nel workspace?
ls() restituisce un vettore di stringhe con i nomi degli
oggetti presenti nel workspace; passando questo vettore all'argomento
list di rm(), tutti gli oggetti vengono
cancellati. Per cancellare un singolo oggetto basta invece
rm(x).
ls() da solo elenca gli oggetti ma non li cancella.
rm(ls()) è l'errore più insidioso: sembra logico, ma
passato per posizione il risultato di ls() non viene
interpretato come un elenco di nomi e R restituisce un errore; il
vettore dei nomi va passato per nome all'argomento list. La
quarta tenta di installare un pacchetto, operazione che non ha nulla a
che vedere con il workspace.