Vai al contenuto principale

Oggetti e classi in R

Scopri la programmazione orientata agli oggetti (OOP) insieme agli oggetti di R e alle diverse classi come S3 e S4, come costruirle, creare funzioni generiche con esempi e molto altro.
Aggiornato 29 set 2026  · 9 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

La programmazione orientata agli oggetti (OOP) è un paradigma di programmazione in cui si progetta il software attorno a dati o oggetti piuttosto che alle funzioni. Un metodo non è altro che una funzione, vista nel contesto OOP. È orientata agli oggetti perché tutta l’elaborazione ruota attorno a oggetti e campi. Ogni oggetto ha attributi e comportamenti diversi.

Nella programmazione orientata agli oggetti, l’intero programma può essere suddiviso in diverse classi per capire più rapidamente come viene eseguito. R è un linguaggio di programmazione funzionale, e l’OOP aiuta a gestire problemi in sistemi di grandi dimensioni. L’OOP viene spesso usata per gestire applicazioni GUI, soprattutto web application. La programmazione orientata agli oggetti è utile per costruire strumenti per l’analisi dei dati, ma non è l’ideale per l’analisi dei dati in sé.

Sistemi di OOP

Esistono principalmente due grandi sistemi di OOP, descritti di seguito:

  • Classi S3: permettono di fare l’overload delle funzioni.
  • Classi S4: permettono di limitare i dati, dato che il debug del programma è piuttosto complesso

Nota: Queste classi verranno trattate in dettaglio nella sezione successiva.

Oggetti in R

Gli oggetti sono istanze della classe. Inoltre, in R tutto è un oggetto; per saperne di più consulta I tipi di dati in R. Possono anche avere attributi come class, attributes, dimnnames, names, ecc.

Per esempio, agli oggetti si assegna un valore usando <-, considera il seguente pezzo di codice in cui “a1” e “a2” sono variabili a cui è assegnato un valore numerico.

a1 <- 10
a2 <- 20

A un oggetto può essere assegnato un insieme di numeri: “a3” è l’oggetto che contiene un vettore di numeri diversi.

a3 <- c(10,20,30)

Qui c inserisce i numeri 10, 20, 30 in un vettore.

Prendiamo un esempio reale come uno studente, che ha attributi come nome, età, classe e genere; l’insegnante ha nome, età e genere.

st_name <- "andrew"
st_age <- 16
st_class <- 10
st_gender <- "male"

t_name <- "angelina"
t_age <- 26
t_gender <- "female"

student <- c(st_name, st_age, st_class, st_gender)
teacher <- c(t_name, t_age, t_gender)


print(student)
print(teacher)
[1] "andrew" "16"     "10"     "male"  
[1] "angelina" "26"       "female"   

Il codice sopra fornisce il seguente output:

"andrew" "16" "10" "male"  
"angelina" "26"  "female"

Nel codice precedente puoi vedere un esempio in cui ci sono diversi tipi di oggetti. Gli oggetti “student” e “teacher”, detti anche variabili, contengono tipi “character” e “double”.

Classi in R

La classe è il progetto che aiuta a creare un oggetto e contiene le sue variabili membro insieme agli attributi.

Come discusso in precedenza, in R ci sono due classi: S3 e S4.

Classe S3

Queste classi aiutano a fare l’overload delle funzioni suddividendole in generiche e metodi.

funzioni = generiche + metodi

S3 è molto diversa da altri linguaggi di programmazione come C#, Java, ecc. Poiché è molto semplice da implementare, usa solo il primo argomento per il dispatch. Per questo motivo non richiede troppe conoscenze dal punto di vista di un programmatore.

S3 funziona definendo una rigorosa convenzione di denominazione del tipo generico.punto.classe.

                             generic.class

Gli argomenti dei metodi dovrebbero contenere gli argomenti della generica e il metodo dovrebbe includere un ...arg.

Costruzione ed esempio di classe S3

Nel seguente esempio vedrai come costruire una classe S3, che mostra la creazione della lista in cui i componenti vengono passati insieme al nome di classe appropriato, e infine viene stampato il risultato.

Nell’esempio seguente “studentBio” contiene una lista in cui i componenti sono passati come lista: “student_name”, “student_age” e “student_contact”. La classe si chiama “Student Info” e “studentBio” è la nuova classe creata, i cui valori sono mostrati sotto.

studentBio <- list(studentName = "Harry Potter", studentAge = 19, studentContact="London")
class(studentBio) <- "StudentInfo"
studentBio
$studentName
[1] "Harry Potter"

$studentAge
[1] 19

$studentContact
[1] "London"

attr(,"class")
[1] "StudentInfo"

Il codice sopra dà il seguente output:

$studentName
 "Harry Potter"

$studentAge
19

$studentContact
"London"

attr(,"class")
"StudentInfo"

Se non ti senti a tuo agio a scrivere funzioni in R, leggi A Tutorial on Using Functions in R!

Creare la tua funzione generica in S3

Qui sotto implementerai la tua funzione generica usando il seguente codice.

Il codice seguente mostra la funzione generica chiamata “contact”, a cui viene passato l’oggetto. Inoltre, “UseMethod” viene usato con la funzione generica “contact”, dove avviene il “dispatching” del metodo, cioè il processo in cui il risultato varia in base agli argomenti passati.

contact <- function(object) {
UseMethod("contact")
}

Creiamo un metodo per la classe specifica che hai creato prima, chiamata “StudentInfo”. Si usa il metodo “contact” seguito dalla notazione con il punto insieme alla classe “StudentInfo”, e il corpo della funzione accede all’attributo “studentContact” usando “$”.

contact.StudentInfo <- function(object) {
cat("Your contact is", object$studentContact, "\n")
}
contact(studentBio)
Your contact is London

Il codice sopra usa object$studentContact, dove l’oggetto passato come argomento alla funzione, insieme a “$”, permette di accedere all’attributo “studentContact”, producendo il seguente output.

Your contact is London

Classe S4

La classe S4 è più rigorosa, convenzionale e strettamente legata ai concetti orientati agli oggetti. Le classi sono rappresentate dalle definizioni formali delle classi S4. Più nello specifico, S4 ha funzioni setter e getter per metodi e generiche. Rispetto alla classe S3, S4 consente di gestire il multiple dispatch.

Vediamo le classi di R discusse sopra creandole e commentandole con un esempio.

Una classe S4 è definita usando la funzione setClass.

 setClass()

Costruzione ed esempio di classe S4

Come accennato, la classe S4 è definita dal metodo setClass(). Userai il metodo setClass() per creare e definire la classe S4. Useremo una subroutine per verificare che i dati siano coerenti (validazione) e imposteremo anche i valori predefiniti (il paradigma).

Di seguito trovi il codice per definire la classe e i suoi slot:

Di seguito si definisce una classe, detta anche “prototype”, in cui gli slot sono definiti: il nome della classe è “employee”, name è un character, id è numeric e contact è un character.

setClass("employee", slots=list(name="character", id="numeric", contact="character"))

Il codice seguente può creare istanze o oggetti specifici di S4.

Creiamo un oggetto usando “new” con il nome della classe “employee”, compilando gli slot name, id e contact con un valore.

obj <- new("employee",name="Steven", id=1002, contact="West Avenue")
obj
Un oggetto di classe "employee"
Slot "name":
[1] "Steven"

Slot "id":
[1] 1002

Slot "contact":
[1] "West Avenue"
Un oggetto di classe "employee"
Slot "name":
"Steven"

Slot "id":
1002

Slot "contact":
"West Avenue"

L’output sopra mostra che l’oggetto creato è di classe “employee” e lo slot “name” vale “Steven”, lo slot “id” ha valore 1002 e lo slot “contact” ha valore “West Avenue”.

Funzioni e comandi

Per verificare se un oggetto è un oggetto S4 o meno si possono usare i due comandi seguenti:

Il comando “is.object(obj)” verifica se una variabile o istanza si riferisce o meno a un oggetto.

is.object(obj)

TRUE

Il codice sopra restituisce il seguente output:

TRUE

Il comando “is.S4(obj)” verifica se una variabile o istanza è un oggetto S4 oppure no.

isS4(obj)

TRUE

Il codice sopra restituisce il seguente output:

TRUE

Accesso e modifica del valore degli slot

Accedere agli slot

Gli slot possono essere accessi usando “@” invece di “$”.

Si usa “obj@name”, cioè il nome dell’oggetto insieme al nome dello slot, per accedere al nome “Steven”, e in modo analogo “obj@id”.

obj@name
obj@id

‘Steven’

1002

Il codice sopra dà il seguente output:

'Steven'
1002

Modificare gli slot

Modifichiamo il valore di uno slot usando semplicemente l’operatore di assegnazione (“<-”), assegnando a “obj@contact” un nuovo valore: “North Avenue”.

obj@contact <- "North Avenue"
obj
Un oggetto di classe "employee"
Slot "name":
[1] "Steven"

Slot "id":
[1] 1002

Slot "contact":
[1] "North Avenue"

Il codice sopra dà il seguente output:

Un oggetto di classe "employee"
Slot "name":
"Steven"

Slot "id":
1002

Slot "contact":
"North Avenue"

L’output mostra che lo slot “contact” ha cambiato valore, in precedenza “West Avenue”, ora “North Avenue”.

In alternativa, c’è l’opzione di usare “slot()” per cambiare il valore.

“slot(obj, "id")” indica che il valore dello slot “id” deve essere cambiato assegnando 1004, e il risultato viene stampato con “obj”.

slot(obj,"id") <- 1004
obj
Un oggetto di classe "employee"
Slot "name":
[1] "Steven"

Slot "id":
[1] 1004

Slot "contact":
[1] "North Avenue"
Un oggetto di classe "employee"
Slot "name":
"Steven"

Slot "id":
1004

Slot "contact":
"North Avenue"

L’output mostra che lo slot “id” ha cambiato valore, da 1002 a 1004.

Creare la tua funzione generica in S4

Creiamo una funzione che aiuti a stampare l’output secondo le nostre esigenze, usando “setMethod()” e la funzione generica “show()”. Inoltre, il valore di tutti gli slot viene accesso con “@” e i relativi nomi vengono stampati. Infine, l’output è ottenuto con “obj”.

setMethod("show",
"employee",
function(object) {
cat("Name:",object@name, "\n")
cat("Id:",object@id, "\n")
cat("Contact:", object@contact, "\n")
}
)
obj
Name: Steven
Id: 1004
Contact: North Avenue
Name: Steven
Id: 1004
Contact: North Avenue

L’output sopra mostra che i risultati sono stampati sotto forma di nomi degli slot insieme ai rispettivi valori.

Congratulazioni

Congratulazioni, sei arrivato alla fine di questo tutorial!

In questo tutorial hai imparato la programmazione orientata agli oggetti (OOP) insieme agli oggetti di R, le diverse classi come S3 e S4, come costruirle, come creare funzioni generiche con esempi e molto altro.

Se vuoi approfondire R, dai un’occhiata ai corsi di DataCamp:

Object-Oriented Programming with S3 and R6 in R

Argomenti
R
Data Science

Scopri di più su R

Corso

Programmazione orientata agli oggetti con S3 e R6 in R

4 ore
23.7K
Gestisci la complessità del tuo codice usando la programmazione orientata agli oggetti con i sistemi S3 e R6.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

Mostra AltroMostra Altro