Обложка канала

R4marketing | канал Алексея Селезнёва | Язык R

Автор канала Алексей Селезнёв, руководитель отдела аналитики в Netpeak, автор R пакетов: ryandexdirect, rfacebookstat и др. В канале публикуются статьи, доклады, новости, заметки по языку R.

R4marketing | канал Алексея Селезнёва | Язык R

4 года назад
Открыть в
​​Как проверить принадлежность объекта определённому классу 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