Indice
Oggetti e classi
R è un linguaggio di programmazione orientata agli oggetti1).
In R ogni entità (struttura di dati, funzione, risultato, ecc.) è un oggetto.
Gli oggetti appartengono ad una o più classi, che definiscono i metodi a loro applicabili. Ad esempio un vettore stringa non verrà trattato come un vettore numerico, o come una matrice. Se si tenterà di applicare una funzione inadatta, verrà restituito un messaggio di errore.
In R, le strutture di dati sono di cinque tipi:
Assegnamento
Per costruire oggetti (variabili ecc.), utilizziamo il comando di assegnamento.
x <- 3 + 5
Tipi di oggetti
Per sapere di che tipo è un oggetto, utilizziamo il comando typeof()
.
# un vettore di numeri reali typeof(cars$speed) ## [1] "double" # un dataframe (è una lista) typeof(cars) ## [1] "list"
typeof()
: Restituisce il modo in cui R rappresenta l'oggetto di base, la natura fondamentale e primitiva dell'oggetto (numeri, caratteri, logico, ecc).
Classi di oggetti
Ogni oggetto appartiene ad una classe. «Le classi sono uno strumento per costruire strutture dati che contengano non solo dati ma anche il codice per gestirli. […] I membri di una classe sono dati (esattamente come i membri di un record), chiamati attributi, e metodi, ovvero procedure, che operano su un oggetto»2)
# un vettore numerico class(cars$speed) ## [1] "numeric" # un dataframe class(cars) ## [1] "data.frame"
La classe definisce quindi come le funzioni generiche di R (print()
, summary()
, plot()
, ecc.) si comportano con quell'oggetto, indica il modo in cui R dovrebbe “trattarlo”.
Un oggetto può avere anche più classi.
I metodi (funzioni e comandi) si applicano diversamente a seconda della classe degli oggetti: la funzione generica summary()
, ad esempio, darà risultati diversi a seconda dell'oggetto al quale sarà applicata:
# summary di un dataframe summary(cars) ## speed dist ## Min. : 4.0 Min. : 2.00 ## 1st Qu.:12.0 1st Qu.: 26.00 ## Median :15.0 Median : 36.00 ## Mean :15.4 Mean : 42.98 ## 3rd Qu.:19.0 3rd Qu.: 56.00 ## Max. :25.0 Max. :120.00 # summary di un vettore numerico summary(cars$speed) ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 4.0 12.0 15.0 15.4 19.0 25.0 # summary di un fattore summary(ChickWeight$Diet) ## 1 2 3 4 ## 220 120 120 118
La somma verrà eseguita su alcuni tipi di oggetti (numerici) ma non su altri (stringhe).
x <- 3 + 5 y <- "pippo" x + 4 ## [1] 12 y + 4 ## Error in y + 4 : non-numeric argument to binary operator
Informazioni sugli oggetti
Per sapere cosa contiene un oggetto x
:
x
## [1] 8
Per sapere a quale tipo appartiene un oggetto x
:
typeof(x) ## [1] "numeric"
Per sapere a quale classe appartiene un oggetto x
:
class(x) ## [1] "numeric"
Per conoscere la struttura di un oggetto x
(tipo, dimensioni, alcune informazioni sui contenuti):
str(x) ## num 8
Con attributes()
possiamo conoscere le altre caratteristiche (non intrinseche) di un oggetto.
attributes(cars) ## $names ## [1] "speed" "dist" ## ## $row.names ## [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 ## [27] 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 ## ## $class ## [1] "data.frame"
(Vedi le voci: Dataframe, Workspace (area di lavoro), Vettori)
Script di esempio (download)
- objects.R
# un vettore di dati reali typeof(cars$speed) class(cars$speed) # un dataframe typeof(cars) class(cars) ## CLASSI E METODI # summary di un dataframe summary(cars) # summary di un vettore numerico summary(cars$speed) # summary di un fattore summary(ChickWeight$Diet) ## ASSEGNAMENTO, CLASSI E METODI x <- 3 + 5 y <- "pippo" x + 4 # somma su un vettore carattere: messaggio di errore y + 4 # informazioni sugli oggetti x typeof(x) class(x) str(x) attributes(cars)