Comments 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 это всё уже сразу считается вектором, т.е. одно число — это вектор длины 1, и т.д.
Я бы так не сказал. Безусловно, есть запутанные вещи, которые возникли из-за первоначальной ориентированности на прикладное использование, но это далеко не «всё».
хорошо, возможно я выразился слишком резко :)
R прошёл достаточно большой путь с момента его создания. На нём уже можно делать значительно больше и без особых неудобств.
это понятно. И я использую не для статистики. Тут больше исторический аспект
Выделение отдельных «векторных типов» можно считать аналогом выделения в других языках программирования отдельных базовых типов для числа, символа, булевой переменной, и др. Только в R это всё уже сразу считается вектором, т.е. одно число — это вектор длины 1, и т.д.
Согласен, но вопрос в том, являются ли эти базовые типы классами или нет. Например в питоне булевая переменная это класс.
Согласен, но вопрос в том, являются ли эти базовые типы классами или нет.
Как всегда, всё зависит от того, когда X
считать "объектом класса Y" (в S3 ООП). На практике это означает, что "Y" присутствует в результате вызова class(X)
. В документации этой функции говорится, что это значение атрибута "class", но если его нет, то тогда используется его "неявный класс" (что видится, как результат особого if-else
в коде функции).
Моё понимание такое, что "numeric vector", "logical vector" и компания являются "базовыми типами", которые могут быть использованы при S3 ООП благодаря некоторым фиксированным модификациям в коде base R. Частично это подтверждается тем, что существует функция oldClass()
которая в случае обычных векторов возвращает NULL
, что говорит об отсутствии класса.
Частично это подтверждается тем, что существует функция oldClass() которая в случае обычных векторов возвращает NULL, что говорит об отсутствии класса.
вот подобную запутанность я и имел ввиду :)
В любом случае, наше обсуждение – это всё теоретические изыски и к сути данной статьи они уже мало относятся.
Del
plot()
на разных объектах это наглядно демонстрирует).
ООП в языке R (часть 1): S3 классы