Подтвердить что ты не робот

Есть ли причина предпочесть функции экстрактора для доступа к атрибутам с помощью $?

В потоке на CrossValidated я сделал следующий комментарий:

Я подозреваю, что на самом деле это вопрос R о разнице между работа с классами S3 (доступ к которым осуществляется через классы $) и S4 (что доступны через @)...

@Гавин Симпсон впоследствии прокомментировал:

@gung более чем вероятно, но решение, вероятно, не, чтобы вникать в объекты и разрывать все, что вы чувствуете, но научиться использовать экстрактор, в этом случае coefficients() или его более короткий псевдоним coef(), как в coef(fit)

Я заинтригован этим. Почему использование coef(model) лучше, чем model$coefficients[,1] , например? (я признаю, что последний является более уродливым и требует немного большего набора текста, но я сомневаюсь, что причина была.) Как насчет того случая, когда нет существующей функции экстрактора (например, доступ к t-статистике)?

4b9b3361

Ответ 1

Потому что тогда автор используемого вами пакета может изменить базовую структуру объекта модели, не беспокоясь о том, чтобы сломать каждый код.

Очевидно, это обобщает и R Core. Рекомендуется использовать эти функции экстрактора, потому что тогда вы можете быть уверены, что он всегда вернет правильную информацию, даже если авторы функций сочтут необходимым перемешать вещи под капотом.

Может быть, они добавляют некоторую дополнительную информацию к одному из элементов объекта списка модели и что изменяет порядок всего? Весь ваш код сломается.

Ответ 2

Другая главная причина заключается в том, что вам нужно быть осторожным, что вы получаете. Например, что вы получаете, если вы делаете

mod <- glm(y ~ x1 + x2, data = foo, family = binomial)
mod$residuals

?? (Наведите указатель ниже для ответа, если вы не знаете!)

Вы получаете рабочие остатки, которые, вероятно, не очень полезны для многих людей.

Функция extractor знает об этом и вернет что-то полезное или позволит использовать для извлечения различных аспектов искомого компонента.

Я всегда говорю людям, которым я учу R, что они не должны использовать $ или @, если они не очень хорошо знакомы с методом и объектом, к которому обращаются, и никогда не производят код - вы просто просите о проблемах, если вы делаете.