Как стать автором
Обновить

Комментарии 13

Я бы добавил, что, не смотря на:
"[<-.emp" <- function(x, i, value) …
, таким образом:
employee1$surname <- "d"
всё прекрасно изменяется. А это может привести к потенциальным ошибкам.
Благодарю, добавлю эту инфу в статью.

Спасибо, очень хорошая статья для начинающих. Будет на что ссылаться для не англоговорящих.


Парочка замечаний для не начинающих:


  • Вектор — это не класс. Насколько я понимаю, даже не существует такого отдельного типа "вектор", а есть разные "векторные типы": "вектор logical", "вектор integer", и т.д (источник). Более точно будет сказать, что S3 класс — это то, что возвращает функция class(). В наиболее типичных случаях это значение атрибута "class", но не всегда. Для вектора letters она возвращает "character", хотя атрибута "class" у него нет.
  • Хотя для создания собственного класса действительно достаточно создать список (list), это не обязательно. Для этого можно использовать любой объект, кроме NULL. Например, базовые векторы, функции и т.д. Для этого достаточно изменить атрибут "class" (например, как Вы пишете, с помощью вызова class(x) <- "a").
Спасибо за дополнение и комментарий, немного позже попробую добавить эту информацию в статью.
Если брать не терминологию R (в которой всё запутано и противоречиво), а общий подход к ООП, то, наверное, вектор можно назвать классом.
Я думаю, что вся терминология R обусловленна тем, что это прикладной язык для статистики. Поэтому для создателей в обучении и понимании проще было выделить особые виды «классов» векторы в отдельные сущности. Но с точки зрения программирования такое разделение немного надуманно. Но это всё, конечно, мой взгляд на вещи.
(в которой всё запутано и противоречиво)

Я бы так не сказал. Безусловно, есть запутанные вещи, которые возникли из-за первоначальной ориентированности на прикладное использование, но это далеко не "всё".


… это прикладной язык для статистики.

R прошёл достаточно большой путь с момента его создания. На нём уже можно делать значительно больше и без особых неудобств.


… такое разделение немного надуманно

Выделение отдельных "векторных типов" можно считать аналогом выделения в других языках программирования отдельных базовых типов для числа, символа, булевой переменной, и др. Только в R это всё уже сразу считается вектором, т.е. одно число — это вектор длины 1, и т.д.

Я бы так не сказал. Безусловно, есть запутанные вещи, которые возникли из-за первоначальной ориентированности на прикладное использование, но это далеко не «всё».

хорошо, возможно я выразился слишком резко :)
R прошёл достаточно большой путь с момента его создания. На нём уже можно делать значительно больше и без особых неудобств.

это понятно. И я использую не для статистики. Тут больше исторический аспект
Выделение отдельных «векторных типов» можно считать аналогом выделения в других языках программирования отдельных базовых типов для числа, символа, булевой переменной, и др. Только в R это всё уже сразу считается вектором, т.е. одно число — это вектор длины 1, и т.д.

Согласен, но вопрос в том, являются ли эти базовые типы классами или нет. Например в питоне булевая переменная это класс.
Согласен, но вопрос в том, являются ли эти базовые типы классами или нет.

Как всегда, всё зависит от того, когда X считать "объектом класса Y" (в S3 ООП). На практике это означает, что "Y" присутствует в результате вызова class(X). В документации этой функции говорится, что это значение атрибута "class", но если его нет, то тогда используется его "неявный класс" (что видится, как результат особого if-else в коде функции).


Моё понимание такое, что "numeric vector", "logical vector" и компания являются "базовыми типами", которые могут быть использованы при S3 ООП благодаря некоторым фиксированным модификациям в коде base R. Частично это подтверждается тем, что существует функция oldClass() которая в случае обычных векторов возвращает NULL, что говорит об отсутствии класса.

Частично это подтверждается тем, что существует функция oldClass() которая в случае обычных векторов возвращает NULL, что говорит об отсутствии класса.

вот подобную запутанность я и имел ввиду :)
В любом случае, наше обсуждение – это всё теоретические изыски и к сути данной статьи они уже мало относятся.
Стоит дополнить, что ООП в R резко отличается от других языков. Во-первых, это наличие нескольких объектных моделей (S3, S4, ...). Во-вторых, методы принадлежат функциям, а не классам (пример с использованием plot() на разных объектах это наглядно демонстрирует).
Я не специалист в терминологии, но, вроде, в R6 методы принадлежат классам.

Да, вы правы: методы принадлежат функциям только в базовых моделях S3 и S4.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории