2012-03-16 3 views
14

Я разрабатываю основное обновление для R-пакета, и в рамках изменений я хочу начать использовать методы S3, чтобы я мог использовать общие графические, сводные и печатные функции. Но я думаю, что я не совсем уверен, что понимаю, почему и когда использовать общие функции в целом.Использование общих функций R, когда и почему?

Например, в настоящее время у меня есть функция logLikSSM, которая вычисляет логарифмическую правдоподобие модели пространства состояний. Вместо использования этих функций я мог бы создать функцию logLik.SSM или что-то в этом роде, поскольку в R. существует общая функция logLik. Преимущество этого заключается в том, что logLik короче, чем logLikSSM, но действительно ли есть какой-либо другой момент в это?

Аналогичный случай, есть общая функция, называемая имитацией в пакете статистики, поэтому теоретически я мог бы использовать это вместо имитацииSSM. Но теперь описание функции симуляции говорит о том, что функция используется для «имитации ответов», но моя функция фактически имитирует скрытые состояния, поэтому она действительно не вписывается в описание имитации функции. Так что, вероятно, в этом случае я не должен использовать общую функцию?

Приносим извинения, если этот вопрос слишком расплывчатый.

ответ

10

В преимущества создания методов воспроизведенных из ядра R включают в себя:

  1. Простота в использовании. Пользователи вашего пакета, уже знакомого с этими дженериками, будут меньше помнить, что вам проще использовать ваш пакет. Возможно, они даже смогут сделать определенную сумму, не прочитав документацию. Если вы придумаете свои собственные имена, тогда они должны обнаружить и запомнить новые имена, которые являются дополнительным познавательным бременем.

  2. Кредитное плечо Существующие функции. Кроме того, любые другие функции, которые используют генерики, которые вы создаете, могут автоматически использовать ваши; в противном случае их пришлось бы изменить. Например, AIC использует logLik.

Недостаток является то, что общий предполагает дополнительный уровень отправки и если logLik находится во внутреннем цикле оптимизации не может быть воздействие (хотя, возможно, не является существенным). В этом случае вы можете проверить эффективность вызова общего метода или прямого вызова метода и использовать последнее, если это имеет существенное значение.

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

Возможно, вы захотите ознакомиться с zoo Design manual (см. Ссылку на zoo Design под виньетками в нижней части этой страницы), в которой обсуждаются идеи дизайна, которые вошли в пакет зоопарка. К ним относится идея, обсуждаемая здесь.

EDIT: Добавлены недостатки.

+0

Спасибо, я подумал о первом преимуществе, но мне не хватало второго момента. Хороший вопрос об оптимизации и logLik, нужно проверить это.Я также проверю руководство по зоопарку. –

4

хорошо вопрос.

Я разделю ваш вопрос на две части; вот первый из них:

i] Есть ли в действительности какой-либо другой пункт в [создании общих функций]?

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

И из-за этой неопределенности, этот шаблон дизайна (который называется перегрузки во многих других языках) является invokved, и которая требует R оценить класс объекта, то отправка объекта для соответствующего метода с учетом тип объекта.

второй часть вашего вопроса: [в] в этом случае я не должен использовать [обобщенная функция] не так ли?

Чтобы попытаться дать вам ответ полезным за детали вашего вопроса, рассмотрим, что происходит с оригинальным методом при вызове setGeneric, передавая этот метод в.

исходная функция тела заменяется с кодом для выполнения диспетчеризации верхнего уровня на основе типа переданного объекта. Это заменяет исходное тело функции, которое просто скользит вниз на один уровень, так что оно становится методом по умолчанию, с которым отправляется функция верхнего уровня (общего типа).

showMethods() позволит вам увидеть все те методы, которые вызывается новой созданной функцией отправки (общая функция).

+0

Спасибо, это заставило меня лучше понять аргументы за дженериками. –

0

А теперь один огромный недостаток:

Удобство неправильного использования: Пользователи пакета уже знакомы с этими дженериков может сделать определенное количество без чтения документации.

И в этом заблуждение, что компоненты, многоразовые объекты, службы и т. Д. - легкая панацея для всех задач программного обеспечения.

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

Там была причина для статического соединения и небольших исполняемых файлов в тот же день. Но теперь это поколение кода теперь получает деньги, отлаживая позже, если когда-либо, до того, как увольнения/IPO придут, не имеет памяти о днях, когда код действительно работал очень надежно, а установка/интеграция не требовали 200 $/час. Большие 4 консультанта или хакеры, которые проводят неделю, пытаясь получить и установить «простой» продукт с открытым исходным кодом и продуктивно работать.

Но если вы хотите продолжить традицию писать все более короткие имена функций/методов, будьте моим гостем.

Смежные вопросы