Top 10 Errori in R e Come Risolverli

‘I 10 Errori Più Comuni in R e Come Risolverli’

Se stai iniziando con R, spesso incontrerai errori nel tuo codice che impediscono di eseguirlo. Ricordo che quando ho iniziato ad usare R, gli errori nel mio codice erano così frequenti che quasi ho rinunciato a imparare questo linguaggio di programmazione. Ricordo perfino di essere tornato ad usare Excel alcune volte per completare le mie analisi perché non riuscivo a capire cosa stesse causando il problema.

Fortunatamente, mi sono spinto a continuare nonostante le difficoltà dell’inizio. E oggi, anche se incontro ancora errori quasi ogni volta che scrivo codice R, con esperienza e pratica ci vuole sempre meno tempo per correggerli. Se anche tu stai avendo difficoltà all’inizio, sii tranquillo, è normale: tutti vivono un po’ di frustrazione quando si impara un nuovo linguaggio di programmazione (e questo vale non solo per R).

In questo post, evidenzio i 10 errori più comuni in R e come correggerli. Ovviamente, gli errori dipendono dal tuo codice e dalle tue analisi, quindi è impossibile coprirli tutti (e Google lo fa molto meglio di me). Tuttavia, mi piacerebbe concentrarmi su alcuni errori di sintassi comuni che si verificano spesso durante l’apprendimento di R e che a volte possono richiedere molto tempo per essere corretti, prima di realizzare che la soluzione è proprio davanti ai nostri occhi.

Questa raccolta è basata sulla mia esperienza personale e sugli errori riscontrati dai miei studenti quando insegno R. Essendo questa lista non esaustiva, sentiti libero di commentare (alla fine del post) con gli errori che incontri spesso quando usi R.

Per ogni errore, fornisco esempi e soluzioni per correggerli. Inoltre, menziono un paio di avvertimenti (che, strettamente parlando, non sono errori) alla fine del post.

1. Parentesi, graffe, parentesi quadre o virgolette non abbinate

Un errore piuttosto banale ma ancora abbastanza frequente è una parentesi, graffa, parentesi quadra o virgoletta mancante.

Questo tipo di errore è applicabile a molti linguaggi di programmazione. In R, per esempio:

## manca una parentesi di chiusura:mean(c(1, 7, 13)     ## manca una graffa prima di "else":x <- 7 if(x > 10) {  print("x > 10") else {  print("x <= 10") }  ## manca una parentesi quadra:summary(ggplot2::diamonds[, "price")## manca il carattere di chiusura nella 2a stringa:grp <- c("Group 1", "Group 2) grp

Questi errori sono facili da individuare quando il codice è semplice, ma possono diventare molto più difficili da individuare con un codice più complesso, ad esempio:1

for (i in y) {  for (j in x) {    p <- ggboxplot(dat,      x = colnames(dat[j]), y = colnames(dat[i]),      color = colnames(dat[j]),      legend = "none",      palette = "npg",      add = "jitter"    )    print(      p + stat_compare_means(aes(label = paste0(..method.., ", p-value = ", ..p.format..),        method = method1, label.y = max(dat[, i], na.rm = TRUE)      )      + stat_compare_means(comparisons = my_comparisons, method = method2, label = "p.format")    )  }

Felizmente, se utilizzi RStudio,2 una parentesi, graffa, parentesi quadra o virgoletta di chiusura verrà automaticamente inserita quando ne apri una.

Ricorda che quando installi un pacchetto, deve essere utilizzato il segno di citazione (singolo o doppio) attorno al nome del pacchetto:

## NON corretto:install.packages(ggplot2)

## Error in install.packages : object 'ggplot2' not found

Invece, scrivi una delle due opzioni seguenti:

# install.packages("ggplot2")# install.packages('ggplot2')

Soluzione

La soluzione, ovviamente, è semplicemente abbinare tutte le parentesi di apertura, le graffe, le parentesi quadre e le virgolette con le loro controparti di chiusura:

mean(c(1, 7, 13))

## [1] 7

x <- 7if (x > 10) {  print("x > 10")} else {  print("x <= 10")}

## [1] "x <= 10"

summary(ggplot2::diamonds[, "price"])

##      price      ##  Min.   :  326  ##  1st Qu.:  950  ##  Median : 2401  ##  Mean   : 3933  ##  3rd Qu.: 5324  ##  Max.   :18823

grp <- c("Group 1", "Group 2")grp

## [1] "Group 1" "Group 2"

Inoltre, assicurati di:

  • posizionare correttamente le virgole:
## NON corretto (virgola mal posizionata):c("Group 1," "Group 2")

## Error: unexpected string constant in "c("Group 1," "Group 2""

## anche NON corretto (virgola mancante):c("Group 1" "Group 2")

## Error: unexpected string constant in "c("Group 1" "Group 2""

## corretto:c("Group 1", "Group 2")
  • non mescolare virgolette singole e doppie per lo stesso elemento:
## NON corretto:c("Group 1')## corretto:c("Group 1")## corretto anche:c('Group 1')

N.B. c('Group 1', "Group 2") non genera un errore ma per coerenza non è consigliato mescolare virgolette singole e doppie nello stesso vettore.

2. Usare una funzione che non è installata o caricata

Se incontri l’errore seguente: “Errore in… : impossibile trovare la funzione ‘…'”, ad esempio:

significa che stai cercando di utilizzare una funzione appartenente a un pacchetto che non è ancora installato o caricato.

Soluzione

Per risolvere questo errore, devi installare il pacchetto (se non è ancora installato) e caricarlo con le funzioni install.packages() e library() rispettivamente:

## installa il pacchetto:install.packages("ggplot2")## carica il pacchetto:library(ggplot2)

Se non sei sicuro sull’utilizzo di queste due funzioni, consulta maggiori dettagli su come installare e caricare un pacchetto in R.

3. Errori tipografici nei nomi delle funzioni, delle variabili, dei dataset, degli oggetti o dei pacchetti

Un altro errore comune è commettere errori di battitura nel nome di una funzione, di una variabile, di un dataset, di un oggetto o di un pacchetto, ad esempio:

## errore di battitura nel nome della funzione:maen(c(1, 7, 13))

## Error in maen(c(1, 7, 13)) : impossibile trovare la funzione "maen"

## errore di battitura nel nome della variabile:summary(ggplot2::diamonds[, "detph"])

## Error: La colonna `detph` non esiste

## errore di battitura nel nome del dataset:data <- data.frame(  x = rnorm(10),  y = rnorm(10))summary(dta[, 2])

## Error in summary(dta[, 2]) : l'oggetto 'dta' non è stato trovato

## errore di battitura nel nome dell'oggetto:test <- c(1, 7, 13)mean(tset)

## Error in mean(tset) : l'oggetto 'tset' non è stato trovato

## errore di battitura nel nome del pacchetto:library("tydiverse")

## Error in library("tydiverse") : nessun pacchetto chiamato ‘tydiverse’

Soluzione

Verifica di aver scritto correttamente tutte le tue funzioni, variabili, dataset, oggetti e pacchetti:

Nota che R fa distinzione tra maiuscole e minuscolemean() è considerata diversa da Mean() per R!

mean(c(1, 7, 13))

## [1] 7

summary(ggplot2::diamonds[, "depth"])

##      profondità      ##  Min.   :43.00  ##  1° Qu.:61.00  ##  Mediana :61.80  ##  Media   :61.75  ##  3° Qu.:62.50  ##  Max.   :79.00

data <- data.frame(  x = rnorm(10),  y = rnorm(10))data[, 2]

##  [1]  1.3048697  2.2866454 -1.3888607 -0.2787888 -0.1333213  0.6359504##  [7] -0.2842529 -2.6564554 -2.4404669  1.3201133

test <- c(1, 7, 13)mean(test)

## [1] 7

library(tidyverse)

## ── Allego i pacchetti principali tidyverse ──────────────────────── tidyverse 2.0.0 ──## ✔ dplyr     1.1.3     ✔ readr     2.1.4## ✔ forcats   1.0.0     ✔ stringr   1.5.0## ✔ ggplot2   3.4.3     ✔ tibble    3.2.1## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0## ✔ purrr     1.0.2     ## ── Conflitti ────────────────────────────────────────── tidyverse_conflicts() ──## ✖ dplyr::filter() maschera stats::filter()## ✖ dplyr::lag()    maschera stats::lag()## ℹ Utilizzare il pacchetto conflicted (<http://conflicted.r-lib.org/>) per forzare tutti i conflitti a diventare errori

Se sei sicuro di aver scritto correttamente un oggetto, una funzione o un dataset ma ricevi ancora un errore che dice “oggetto ‘…’ non trovato”, assicurati di aver definito il tuo oggetto/funzione/dataset prima di chiamarlo!

Spesso succede che uno studente mi chieda di andare al suo computer perché sta eseguendo lo stesso codice che ho scritto io, ma non riesce a farlo funzionare. La maggior parte delle volte, se il suo codice è effettivamente identico al mio, semplicemente non ha eseguito un oggetto/funzione/dataset prima di eseguire il codice che include quell’oggetto/funzione/dataset. In altre parole, sta cercando di usare un oggetto o una variabile non definiti.

Ricorda che scrivere codice in uno script di R (contrariamente alla console) non significa che sia compilato. Devi effettivamente eseguirlo (cliccando sul pulsante Esegui o usando la scorciatoia da tastiera) affinché il codice venga eseguito e utilizzato successivamente. Se hai ancora difficoltà a riguardo, consulta le basi di R e RStudio.

4. Argomenti mancanti, errati o sbagliati nelle funzioni

La maggior parte delle funzioni di R richiede degli argomenti. Ad esempio, la funzione rnorm() richiede almeno il numero di osservazioni, specificato tramite l’argomento n.

Il tuo codice non verrà eseguito se non specifichi gli argomenti obbligatori o se specifichi in modo errato un argomento. Inoltre, il risultato potrebbe non essere quello che ti aspetti se sbagli a scrivere un argomento:

## argomento obbligatorio mancante:rnorm()

## Error in rnorm() : manca l'argomento "n", senza valore predefinito

## argomento errato:rnorm(n = 3, var = 1)

## Error in rnorm(n = 3, var = 1) : argomento non utilizzato (var = 1)

## argomento scritto in modo errato:mean(c(1, 7, 13, NA), narm = TRUE)

## [1] NA

L’ultimo pezzo di codice non restituisce un errore, ma il risultato non è quello che vogliamo.

Soluzione

Per risolvere questi errori, assicurati di specificare almeno tutti gli argomenti obbligatori della funzione e quelli corretti:

  • Nella funzione rnorm(), si tratta della deviazione standard, sd, che può essere specificata oltre al numero di osservazioni n (invece della varianza var).
  • La rimozione di NA viene fatta con na.rm (anziché narm).
rnorm(n = 3, sd = 1)

## [1] -0.3066386 -1.7813084 -0.1719174

mean(c(1, 7, 13, NA), na.rm = TRUE)

## [1] 7

Se non conosci gli argomenti di una funzione a memoria, puoi sempre controllare la documentazione con ?nome_funzione o aiuto(nome_funzione), ad esempio:

?rnorm()## or:aiuto(rnorm)

5. Dati sbagliati, inadeguati o incoerenti

Ci sono diversi tipi di dati in R, i principali sono:

  • Numerico
  • Carattere
  • Fattore
  • Logico

Sai che alcune operazioni e analisi sono possibili e appropriate solo con alcuni tipi di dati specifici.

Ad esempio, non è appropriato calcolare la media di una variabile di tipo fattoriale o carattere:

gender <- factor(c("femmina", "femmina", "maschio", "femmina", "maschio"))mean(gender)

## Warning in mean.default(gender): argument is not numeric or logical: returning## NA

## [1] NA

Allo stesso modo, anche se tecnicamente possibile, ha poco senso tracciare un barplot di una variabile quantitativa continua perché nella maggior parte dei casi la frequenza sarà 1 per ogni valore:

barplot(table(rnorm(10)))

(A proposito, se i tuoi dati non sono già visualizzati sotto forma di tabella, non dimenticare di aggiungere table() all’interno della funzione barplot().)

Soluzione

Assicurati di utilizzare l’operazione appropriata e il tipo di analisi in base alle variabili di interesse.

Ad esempio:

  • per le variabili fattoriali, è più appropriato calcolare le frequenze e/o le frequenze relative, e tracciare barplot
  • per le variabili quantitative continue, è più appropriato calcolare la media, la mediana, ecc. e tracciare istogrammi, boxplot, ecc.
  • per le variabili logiche, la media, una tabella di frequenze e un barplot sono appropriati
  • per le variabili carattere, le word cloud sono le più appropriate (a meno che la variabile possa essere considerata come una variabile fattoriale perché non ci sono livelli troppo diversi)

Ora illustriamo gli esempi in R:

## fattoriale:table(gender)

## gender## femmina maschio ##       3       2

prop.table(table(gender))

## gender## femmina maschio ##     0.6     0.4

barplot(table(gender))

## quantitativo continuo:x <- rnorm(100)summary(x)

##     Min.  1st Qu.   Mediana     Media  3rd Qu.     Max. ## -2.99309 -0.74143  0.01809 -0.08570  0.58937  2.70189

par(mfrow = c(1, 2)) ## combina due plotistogramma(x)boxplot(x)

## logical:x <- c(TRUE, FALSE, FALSE, TRUE, TRUE)mean(x)

## [1] 0.6

table(x)

## x## FALSE  TRUE ##     2     3

barplot(table(x))

Per il lettore interessato, consulta le statistiche descrittive più comuni in R per diversi tipi di dati.

Si noti che, per quanto riguarda le statistiche descrittive, la scelta del test statistico dipende dal tipo di variabile. Consulta questa flowchart per aiutarti a selezionare il test statistico più appropriato in base al numero di variabili e ai loro tipi.

Un errore legato a quello sopra menzionato è l’incoerenza del tipo di dati. Vedilo in pratica con l’esempio seguente:

x <- c(2.4, 3.7, 5.1, 9.8)class(x)

## [1] "numeric"

y <- c(2.4, 3.7, 5.1, "9.8")class(y)

## [1] "character"

Come puoi vedere, il vettore x è numerico, mentre il vettore y ha la forma di carattere. Questo è dovuto al fatto che l’ultimo elemento di y è circondato da virgolette (e quindi considerato come una stringa invece di un valore numerico), quindi l’intero vettore assume la forma di carattere.

Questo può accadere quando importi un set di dati in R e uno o più elementi di una variabile non sono codificati correttamente. Questo porta all’intera variabile a essere considerata come una variabile di carattere da R.

Per evitare ciò, è una buona pratica controllare la struttura del tuo set di dati (con str()) dopo averlo importato per assicurarti che tutte le variabili abbiano il formato desiderato. In caso contrario, puoi correggere i valori nel file iniziale o cambiare il formato in R (con as.numeric()).

6. Dimenticare il segno + in ggplot2

Se hai appena imparato ad usare il pacchetto ggplot2 per le tue visualizzazioni (e lo consiglio vivamente!), un errore comune è dimenticare il segno +.

Sai che una visualizzazione realizzata con ggplot2 è costruita aggiungendo diversi strati:

## load package:library(ggplot2)## first layer, the dataset:ggplot(data = diamonds) +  ## second layer, the aesthetics:  aes(x = cut, y = price) +  ## third layer, the type of plot:  geom_boxplot() +  ## add more layers:  theme_minimal()

Soluzione

Per tutte le tue grafiche con ggplot2, non dimenticare di aggiungere un + dopo ogni strato tranne l’ultimo.

7. Malinteso tra = e ==

L’assegnazione in R può essere fatta in tre modi, dal più comune al meno comune:

  1. <-
  2. =
  3. assign()

Il secondo metodo, ossia =, non deve essere confuso con ==.

Infatti, assegnare un oggetto (con uno dei tre metodi sopra) viene utilizzato per salvare qualcosa in R. Ad esempio, se vogliamo salvare il vettore (1, 3, 7) e rinominare quel vettore x, possiamo scrivere:

x <- c(1, 3, 7)## o:x = c(1, 3, 7)## o:assegnare("x", c(1, 3, 7))

Quando si esegue questo pezzo di codice, si vedrà che il vettore x di dimensione 3 appare nella scheda “Environment” (il pannello in alto a destra se si utilizza la visualizzazione predefinita di RStudio):

D’ora in poi, possiamo utilizzare quel vettore semplicemente chiamandolo con il suo nome:

x

## [1] 1 3 7

In nessun caso si può assegnare un oggetto con ==:

## NON corretto se vogliamo assegnare c(1, 3, 7) a x:x == c(1, 3, 7)

Quindi ti stai chiedendo, quando dovremmo usare == ? In realtà, viene utilizzato quando si vuole utilizzare un segno di uguaglianza.

Capisco che al momento possa sembrare astratto e confuso, quindi supponiamo i seguenti due scenari come esempi (che sono i due casi più comuni in cui usiamo == ):

  1. vogliamo verificare se un oggetto o una variabile assegnata rispetta alcune condizioni, e
  2. vogliamo suddividere un dataframe in base a una o più condizioni.

Per questi esempi, supponiamo un esempio di 5 bambini:

## creare un dataframe:dat <- data.frame( Name = c("Mary", "Linda", "James", "John", "Patricia"), Age = c(7, 10, 3, 9, 7), Gender = c("Girl", "Girl", "Boy", "Boy", "Girl"))## stampa del dataframe:dat

## Name   Age Gender## 1     Mary   7   Girl## 2    Linda  10   Girl## 3    James   3    Boy## 4     John   9    Boy## 5 Patricia   7   Girl

Ora scriviamo diversi pezzi di codice per questi due scenari per illustrarli:

  • Vogliamo verificare se la variabile Age è uguale al vettore (1, 2, 3, 4, 5):
dat$Age == 1:5

## [1] FALSE FALSE  TRUE FALSE FALSE

Con questo codice, chiediamo se il primo elemento della variabile Age è uguale a 1, il secondo elemento della variabile Age è uguale a 2, e così via. La risposta è ovviamente FALSE, FALSE, TRUE, FALSE e FALSE poiché solo il terzo bambino ha un’età uguale a 3 anni.

  • Vogliamo sapere quali dei nostri 5 bambini campionati sono ragazze:
dat$Gender == "Girl"

## [1]  TRUE  TRUE FALSE FALSE  TRUE

I risultati mostrano che la prima, la seconda e la quinta bambina sono ragazze, mentre il terzo e il quarto bambino non sono ragazze.

Se si scrive una di queste due righe:

## questo sovrascrive Age e Gender:dat$Age = 1:5dat$Gender = "Girl"

In realtà si sovrascrive le variabili Age e Gender, in modo che i nostri 5 bambini avranno un’età compresa tra 1 e 5 (1 anno per il primo bambino, fino a 5 anni per il quinto bambino) e tutti saranno ragazze.

  • Ora supponiamo di voler suddividere il nostro dataframe in base a una condizione, ovvero vogliamo estrarre solo i bambini di 7 anni:
subset(dat, Age == 7)

##      Name Age Gender## 1     Mary   7   Girl## 5 Patricia   7   Girl

Se non vuoi utilizzare la funzione subset, puoi anche utilizzare le parentesi quadre:

dat[dat$Age == 7, ]

##       Name Age Gender## 1     Mary   7   Girl## 5 Patricia   7   Girl

Come puoi vedere negli esempi precedenti, non vogliamo assegnare nulla. Invece, chiediamo “questa variabile o vettore è uguale a qualcos’altro?”. Per questo specifico bisogno, usiamo il simbolo ==.

Quindi, riassumendo, per ragioni tecniche e per distinguere tra i due concetti, R utilizza = per le assegnazioni e == per il segno di uguaglianza. Assicurati di comprendere la differenza tra i due per evitare errori.

8. Colonne non definite selezionate

Se sei abituato a selezionare sottoinsiemi di dataframe con le parentesi quadre, [], invece delle funzioni subset() o filter(), potresti aver incontrato l’errore “Error in [.data.frame(…) : undefined columns selected”.

Ciò si verifica quando R non capisce la colonna che desideri utilizzare durante la selezione del dataset.

Considerando lo stesso campione di 5 bambini introdotto in precedenza, il seguente codice genererà un errore:

dat[dat$Age == 7]

## Error in `[.data.frame`(dat, dat$Age == 7) : undefined columns selected

perché non specifica la dimensione della colonna.

Soluzione

Ricorda che i dataframe in R hanno due dimensioni:

  1. le righe (una per ogni unità sperimentale), e
  2. le colonne (una per ogni variabile)

in quell’ordine specifico (quindi riga prima, quindi colonna)!

Dato che i dataframe hanno due dimensioni, R si aspetta due dimensioni quando chiami dat[].

In particolare, si aspetta la prima e poi la seconda dimensione, separate da una virgola:

dat[dat$Age == 7, ]

##       Name Age Gender## 1     Mary   7   Girl## 5 Patricia   7   Girl

Questo codice significa che stiamo estraendo tutte le righe in cui Age è uguale a 7 (prima dimensione, cioè prima della virgola), per tutte le variabili del dataset (poiché non abbiamo specificato alcuna colonna dopo la virgola).

Per il lettore interessato, vedi più modi per selezionare e manipolare dati in R.

9. Problema durante l’importazione o l’utilizzo del file dati errato

L’importazione di un dataset in R può essere piuttosto difficile per i principianti, principalmente a causa della comprensione errata sulla directory di lavoro.

Quando si importa un file, R non cercherà il file in tutte le cartelle del computer. Invece, guarderà solo in una cartella specifica. Se il tuo dataset non si trova in quella cartella, si verificherà un errore come “cannot open file ‘…’: No such file or directory”:

Per risolvere questo problema, devi specificare il percorso della cartella in cui si trova il tuo dataset. In altre parole, devi dire a R in quale cartella desideri che lavori, da qui il nome directory di lavoro.

Impostare la directory di lavoro può essere fatto con la funzione setwd() o tramite la scheda “Files” nel pannello in basso a destra di RStudio:

In alternativa, puoi spostare il dataset nella cartella in cui R sta lavorando attualmente (puoi scoprire quale è con getwd()). Per ulteriori dettagli su come importare un file in R e sulla directory di lavoro.

Un altro problema correlato è l’utilizzo del file sbagliato. Questo errore è diverso rispetto ai precedenti nel senso che non incontrerai un errore, ma le tue analisi saranno comunque errate.

Può sembrare banale, ma assicurati di importare ed utilizzare il file dati corretto! Questo è particolarmente importante se hai file per diversi momenti nel tempo e che hanno una struttura comune (ad esempio file dati settimanali o mensili con le stesse variabili esatte). Mi è successo di riportare risultati per la settimana sbagliata (fortunatamente senza grandi conseguenze).

Inoltre, assicurati di utilizzare effettivamente tutte le righe che desideri includere nelle tue analisi. Mi è successo di estrarre un campione casuale dal dataset originale per testare un modello (e evitare tempi di calcolo lunghi) e quasi dimenticare di questo campionamento al momento di eseguire le mie analisi finali.

È quindi buona pratica ricordarsi di rimuovere il campionamento e i filtri dopo aver testato il codice (e prima di interpretare i risultati finali).

10. Problema nell’utilizzo dell’operatore $

Per l’ultimo errore di questa top 10, vorrei concentrarmi su due errori correlati:

  1. “L’operatore $ non è valido per vettori atomici”, e
  2. “oggetto di tipo ‘closure’ non è indicizzabile”.

Li raggruppo in una singola sezione perché sono collegati l’uno all’altro nel senso che entrambi coinvolgono l’operatore $.

L’operatore $ non è valido per vettori atomici

Per capire questo errore, prima dobbiamo ricordare che un vettore atomico è un oggetto unidimensionale (di solito creato con c()). Questo è diverso dai dataframes o dalle matrici che sono bidimensionali (ovvero le righe formano la prima dimensione e le colonne corrispondono alla seconda dimensione).

L’errore “L’operatore $ non è valido per vettori atomici” si verifica quando cerchiamo di accedere a un elemento di un vettore atomico utilizzando l’operatore dollaro ($):

## definisci vettore atomico:x <- c(1, 3, 7)## imposta nomi:names(x) <- LETTERS[1:3]## stampa il vettore:x

## A B C ## 1 3 7

## accedi al valore dell'elemento C:x$C

## Errore in x$C: L'operatore $ non è valido per vettori atomici

Soluzione

L’operatore $ non può essere utilizzato per estrarre elementi da vettori atomici. Invece, dobbiamo utilizzare la notazione delle doppie parentesi quadre [[]]:

x[["C"]]

## [1] 7

Ricorda che l’operatore $ può essere utilizzato con i dataframes, quindi possiamo risolvere questo errore convertendo prima il vettore atomico in un dataframe,5 e quindi accedere a un elemento per nome con l’operatore $:

## converti il vettore atomico in un dataframe:x <- as.data.frame(t(x))## stampa x:x

##   A B C## 1 1 3 7

## accedi al valore dell'elemento C:x$C

## [1] 7

oggetto di tipo ‘closure’ non è indicizzabile

Un altro errore (che devo ammettere essere abbastanza oscuro e confuso quando si impara R) è il seguente: “oggetto di tipo ‘closure’ non è indicizzabile”.

Questo errore si verifica quando cerchiamo di indicizzare o accedere ad alcuni elementi di una funzione. Un esempio con la nota funzione mean():

mean[1:3]

## Errore in mean[1:3]: oggetto di tipo 'closure' non è indicizzabile

In R, possiamo indicizzare liste, vettori, matrici, dataframes, ma non funzioni. Quindi restituisce un errore perché è impossibile indicizzare un oggetto di tipo “closure” e una funzione è di quel tipo:

typeof(mean)

## [1] "closure"

Nella maggior parte dei casi, non incontrerai questo errore quando utilizzi una funzione di base come la funzione mean() (perché è improbabile che il tuo obiettivo sia realmente di indicizzare una funzione…).

Infatti, molto probabilmente incontrerai questo errore quando cerchi di indicizzare un dataset chiamato data, ma questo dataset non è definito nell’ambiente (perché non è stato importato o creato correttamente, ad esempio).

Per comprendere il concetto, guarda gli esempi seguenti:

## creare il dataset:data <- data.frame(  x = rnorm(10),  y = rnorm(10))## stampa la variabile x:data$x

##  [1]  1.12288964  1.43985574 -1.09711377 -0.11731956  1.20149840 -0.46972958##  [7] -0.05246948 -0.08610730 -0.88767902 -0.44468400

Fino a qui tutto bene. Ora supponiamo di aver commesso un errore durante la creazione del dataset:

## creare il dataset (con errore):data <- data.frame(x = rnorm(10)                   y = rnorm(10))

Noterai che manca una virgola tra le variabili x e y. Di conseguenza, il dataset chiamato data non viene creato e quindi non è definito.

Pertanto, se ora proviamo ad accedere alla variabile x di quel dataset data, R cercherà effettivamente di sottoporre a selezione la funzione denominata data anziché il dataset denominato data!

data$x

## Error in data$x : object of type 'closure' is not subsettable

Ciò accade perché, ripeto, il dataset data non esiste, quindi R cerca un oggetto denominato data e trova una funzione con quel nome:

class(data)

## [1] "function"

Avvertenze

Le avvertenze sono diverse dagli errori nel senso che ti avvertono su qualcosa, ma non impediscono l’esecuzione del codice. È una buona pratica leggere queste avvertenze in quanto possono fornirti informazioni preziose.

Ci sono troppe avvertenze per elencarle tutte, ma mi piacerebbe concentrarmi su due comuni:

  1. “NAs introdotti per coercizione”, e
  2. “Rimosse… righe contenenti valori non finiti (stat_bin())”.

NAs introdotti per coercizione

Questa avvertenza si verifica quando si cerca di convertire un vettore che include almeno un valore non numerico in un vettore numerico:

x <- c(1, 3, 7, "Emma")as.numeric(x)

## Warning: NAs introdotti per coercizione

## [1]  1  3  7 NA

Non è necessario correggerlo poiché si tratta solo di un’avvertenza e non di un errore. R ti sta semplicemente informando che almeno un elemento nel vettore iniziale è stato convertito in NA perché non poteva essere convertito in un valore numerico.

Rimosse… righe contenenti valori non finiti (stat_bin())

Questa avvertenza si verifica quando si utilizza ggplot2 per disegnare grafici. Ad esempio:

ggplot(airquality) +  aes(x = Ozone) +  geom_histogram()

## 'stat_bin()' utilizza 'bins = 30'. Scegli un valore migliore con 'binwidth'.

## Avvertenza: Rimosse 37 righe contenenti valori non finiti (`stat_bin()`).

Anche in questo caso, poiché si tratta di un’avvertenza, non è necessario correggerla. Ti sta semplicemente informando che ci sono alcuni valori mancanti (NA) nella variabile di interesse e che questi valori mancanti vengono rimossi per costruire il grafico.

Conclusione

Grazie per la lettura.

Spero che questa raccolta di errori ti abbia aiutato a evitare alcuni errori di codifica o che ti abbia aiutato nel debug del tuo codice.

Se non riesci ancora a risolvere il tuo errore, ti consiglierei di leggere la documentazione della funzione (se hai problemi con una particolare funzione) o di cercare online la soluzione. Ricorda che se incontri un errore, è molto probabile che qualcun altro abbia già pubblicato la risposta online (Stack Overflow è di solito una buona risorsa).

R ha una curva di apprendimento ripida, in particolare se non si è familiari con un altro linguaggio di programmazione. Tuttavia, con pratica e tempo, commetterai sempre meno errori di codifica, ma, cosa più importante, sarai sempre più esperto nel digitare le giuste parole chiave nei motori di ricerca, riducendo così il tempo trascorso nella ricerca della soluzione.

Come sempre, se hai domande o suggerimenti legati all’argomento trattato in questo articolo, ti preghiamo di aggiungerli come commento in modo che altri lettori possano trarre beneficio dalla discussione.

Articolo originariamente pubblicato qui da Antoine Soetewey.