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")
Первая проблема:
- Мы можем видеть методы только для загруженных пакетов;
Есть возможность
getS3method(f="foo",class="XYZ")
но для этого требуются и функция, и класс;utils::getAnywere("foo")
более широкий, но также только для загруженных пакетов...
На самом деле это не проблема, если существуют только методы S3 (нет метода S4), и мы не указываем общие, а только новые методы, и мы уверены, что имя класса еще не использовалось.
Вторая проблема:
- Если у функции также есть метод 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 пока не позволяют развиваться в нем...