Как разработчик класса S4, мое мнение таково:
Если вы читаете слотов с помощью @, вы делаете это на свой страх и риск (как и почти все, что вы делаете в R - см. Некоторые известные примеры ниже). При этом слоты класса S4 фактически являются частью документированного интерфейса .
Основные преимущества доступа через @
Я вижу скорость:
> microbenchmark (accessor = wl (chondro), direct = chondro@wavelength)
Unit: nanoseconds
expr min lq median uq max
1 accessor 333431 341289.5 346784.5 366737.5 654219
2 direct 165 212.5 395.0 520.0 1440
(функция доступа выполняет проверку валидности в дополнение к возвращению слота @wavelength
, который вызывает разницу. Я ожидаю, что каждая приличная функция открытого доступа будет обеспечивать достоверность)
Я даже рекомендую использовать доступ на чтение к слотам моего класса в критических по времени ситуациях (например, если к множеству подмножеств одного и того же объекта обращаются, может быть, стоит каждый раз пропускать проверку достоверности неизмененного объекта) и в коде моего пакета я преимущественно читаю слоты напрямую, обеспечивая достоверность в начале и в конце функций, где объект мог стать недействительным. Кто-то может утверждать, что проектное решение (R) о том, что @<-
не проверяет достоверность, на практике приводит к огромным накладным расходам, поскольку методы, работающие с объектами S4, не могут полагаться на действительность объекта, и, следовательно, даже методы с чисто правами чтения должны проверка достоверности.
Если вы думаете о записи доступа к слоту, вы должны действительно знать, что вы делаете. @<-
не не выполняет проверку достоверности, это должен делать официальный метод записи. Кроме того, средство записи может делать гораздо больше, чем просто обновлять один слот, чтобы поддерживать согласованное состояние объекта.
Итак, если вы пишете в слот, ожидайте, что окажетесь в аду и не жалуйтесь. ; -)
Подумайте немного дальше по философской линии: моя посылка общедоступна под лицензией GPL. Я не только позволяю вам адаптировать код к вашим потребностям, но я хочу призвать вас разрабатывать / адаптировать код для ваших нужд. На самом деле это очень просто в R - все уже есть в обычном интерактивном R-сеансе, включая доступ к слотам. Что вполне соответствует проектным решениям, которые делают R очень мощным, но допускают такие вещи, как
> T <- FALSE
> `+` <- `-`
> pi <- 3
> pi + 2
[1] 1