R s3 Как не переписывать обобщенные методы

Я пытаюсь разобраться в системе классов s3 в R.

Документация говорит, что мне нужно создать универсальную функцию для метода, который я хочу создать.

Допустим, я хочу создать метод foo для класса XYZ.

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

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

0 ответов

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

  • Я не уверен, действительно ли проблема заключается в методе S3, перезаписывающем общие методы, но в методах, отличных от s3 (я обнаружил некоторые проблемы с ошибкой при отправке summary s4 методы в lavaan а также semTool пакет).
  • Мы можем проверить доступные методы по methods("foo") или все методы для класса methods(class="XYZ").
  • Мы можем проверить, зарегистрирован ли уже дженерикisGeneric("foo").

Если методы еще не зарегистрированы, нам нужно установить общий using (не в случае summary):

foo<- function(x) UseMethod("foo")

Первая проблема:

  1. Мы можем видеть методы только для загруженных пакетов;
  • Есть возможность getS3method(f="foo",class="XYZ") но для этого требуются и функция, и класс;

  • utils::getAnywere("foo") более широкий, но также только для загруженных пакетов...

На самом деле это не проблема, если существуют только методы S3 (нет метода S4), и мы не указываем общие, а только новые методы, и мы уверены, что имя класса еще не использовалось.


Вторая проблема:

  1. Если у функции также есть метод S4, связанный, очевидно, путем указания нового метода s3 (даже с уже существующим универсальным, как в случае для summary) это нарушает отправку в метод S4
  • На данный момент единственное решение, которое я вижу, - это создать новый метод s3 для каждого идентифицированного метода s4...

(i) Таким образом, мы также можем отслеживать специально для методов S3 .S3methods("foo") или методы s3 для определенного класса .S3methods(class="XYZ") и узнать конкретно о методе S4 (используя .S4methods("foo") например) после загрузки всех основных пакетов волнуюсь...;

(ii) определение класса объекта;

(iii) проверка, есть ли какой-либо соответствующий метод в его документации (очевидно, какой-то метод s4 не так легко идентифицировать в документации, чтобы его можно было легко вызвать внутри s3method)

(iv) если (iii) недоступен, оценка его структуры; а также

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

(использование.default является альтернативой, но я полагаю, что это нужно тщательно продумать).

Но хотя альтернатива повторного определения метода с учетом структуры объекта класса была несколько проще для summary методы, для других функций может потребоваться действительно тяжелая работа...

Я полагаю, что у меня должно быть широкое решение для автоматического рассмотрения методов s4, но мои ограниченные знания о методах S4 пока не позволяют развиваться в нем...

Другие вопросы по тегам