Kom igångKom igång gratis

Vad ligger i ett namn?

S3 använder en strikt namnkonvention: alla S3-metoder har ett namn på formen generic.class.

Omvändningen gäller inte: en funktion kan ha ett namn med en punkt utan att vara en S3-metod. Det stämmer för många funktioner som funnits sedan de tidiga dagarna av S-språket. Till exempel är all.equal() (docs) faktiskt en S3-generic, inte en metod. (Det här är ett exempel på hur leopard.case kan vara förvirrande.)

Du kan kontrollera om en funktion är en S3-generic genom att anropa is_s3_generic() (docs) från paketet pryr. Du kan också skriva ut den (genom att skriva dess namn i konsolen) och sedan kontrollera om den anropar UseMethod().

På samma sätt kan du kontrollera om en funktion är en S3-metod genom att anropa is_s3_method() (docs) från pryr. Till exempel:

library(pryr)
is_s3_generic("t")           # generic transpose function
is_s3_method("t.data.frame") # transpose method for data.frames
is_s3_method("t.test")       # a function for Student's t-tests 

Vilka påståenden stämmer?

  1. is.complex() (docs) är en metod i is-generiken som agerar på complex-objekt.
  2. seq.Date() (docs) är en metod i seq-generiken som agerar på Date-objekt.
  3. is.na.data.frame() (docs) är en metod i is.na-generiken som agerar på data.frame-objekt.
  4. sort() (docs) är en generisk funktion.
  5. order() (docs) är en generisk funktion.

Den här övningen är en del av kursen

Objektorienterad programmering med S3 och R6 i R

Visa kurs

Interaktiv övning med praktiskt arbete

Gör teori till handling med en av våra interaktiva övningar

Starta övningen