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.

  • False
  • False
  • False
  • True

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.

  • False
  • False
  • False
  • True

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.

  • False
  • True
  • False
  • False

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.

  • True
  • False
  • False
  • False

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.

  • False
  • True
  • False
  • False

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

  • False
  • False
  • False
  • True

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.

  • False
  • False
  • True
  • False

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.

  • True
  • False
  • False
  • False

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.

  • True
  • False
  • False
  • False

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.

  • True
  • False
  • False
  • False

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.

  • False
  • False
  • True
  • False

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

  • False
  • False
  • True
  • False

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

  • True
  • False
  • False
  • False

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.

  • True
  • False
  • False
  • False

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.

  • True
  • False
  • False
  • False

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.

  • True
  • False
  • False
  • False

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.

  • False
  • True
  • False
  • False