Как проверить принадлежность объекта определённому классу
R по большей части является функциональным языком программирования, и новички зачастую вообще не обращают внимания на принадлежность какого либо объекта, какому нибудь классу. Тем не менее, в R так же реализована объектно ориентированная парадигма программирования.
Первое, что приходит в голову тем, кто хочет проверить принадлежность какого то объекта определённому классу это class(X)=='foo'. Самая большая проблема этого подхода заключается в том, что в большинстве случаев он сработает, например:
class(mtcars) == 'data.frame'
[1] TRUE
Т.е. когда объект имеет простейшую иерархию классов, то этот подход будет работать, но если мы преобразуем таблицу mtcars в tibble, то его иерархия классов будет уже более сложной, и вы получите немного неожиданный ответ:
class(tibble::tibble(mtcars)) == 'data.frame'
[1] FALSE FALSE TRUE
Это связано с тем, что tibble имеет унаследованные классы:
class(tibble::tibble(mtcars))
[1] "tbl_df" "tbl" "data.frame"
Если вы используете R 4.2.0 и выше, и данное логическое выражение будете использовать внутри конструкции if, то вы вообще получите ошибку.
Другим подходом может быть использование оператора %in%:
'data.frame' %in% class(tibble::tibble(mtcars))
[1] TRUE
Логически этот подход будет работать корректно даже с объектами, которые имеют сложную иерархию классов. Тем не менее, для операции проверки принадлежности объекта определённому классу существует специальная функция :
inherits(tibble::tibble(mtcars), 'data.frame')
[1] TRUE
#заметки_по_R