Inizia subitoInizia gratis

Cosa c’è in un nome?

S3 usa una convenzione di denominazione rigorosa: tutti i metodi S3 hanno un nome della forma generic.class.

Il contrario però non è vero: una funzione può avere un nome con un punto senza essere un metodo S3. È il caso di molte funzioni presenti fin dai primi tempi del linguaggio S. Per esempio, all.equal() (docs) è in realtà una generica S3, non un metodo. (Questo è un esempio di come la notazione leopard.case possa creare confusione.)

Puoi verificare se una funzione è una generica S3 chiamando is_s3_generic() (docs) dal pacchetto pryr. Puoi anche stamparla (digitandone il nome in console) e vedere se chiama UseMethod().

In modo analogo, puoi verificare se una funzione è un metodo S3 chiamando is_s3_method() (docs) da pryr. Per esempio,

library(pryr)
is_s3_generic("t")           # funzione generica per la trasposizione
is_s3_method("t.data.frame") # metodo di trasposizione per data.frame
is_s3_method("t.test")       # una funzione per i test t di Student 

Quali affermazioni sono vere?

  1. is.complex() (docs) è un metodo della generica is che agisce su oggetti complex.
  2. seq.Date() (docs) è un metodo della generica seq che agisce su oggetti Date.
  3. is.na.data.frame() (docs) è un metodo della generica is.na che agisce su oggetti data.frame.
  4. sort() (docs) è una funzione generica.
  5. order() (docs) è una funzione generica.

Questo esercizio fa parte del corso

Programmazione orientata agli oggetti con S3 e R6 in R

Visualizza corso

esercizio interattivo pratico

Trasforma la teoria in pratica con uno dei nostri esercizi interattivi

Inizia esercizio