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?
is.complex()(docs) är en metod iis-generiken som agerar påcomplex-objekt.seq.Date()(docs) är en metod iseq-generiken som agerar påDate-objekt.is.na.data.frame()(docs) är en metod iis.na-generiken som agerar pådata.frame-objekt.sort()(docs) är en generisk funktion.order()(docs) är en generisk funktion.
Den här övningen är en del av kursen
Objektorienterad programmering med S3 och R6 i R
Interaktiv övning med praktiskt arbete
Gör teori till handling med en av våra interaktiva övningar
Starta övningen