Создание методов преобразования между классами S4 из других пакетов

#r #s4

#r #s4

Вопрос:

Предположим, я хочу создать пакет R, который определяет методы принуждения ( methods::as ) между классами S4, которые определены в других пакетах.

Когда я создаю пакет с собственным классом S4, я могу добавлять преобразования в и из других классов, подобных этому:

 setAs("MyClass", "OtherClass", function(from) myfun(from))
 

И они отлично работают после загрузки пакета, при условии, что классы экспортируются правильно.

Но теперь предположим, что я хочу взять class A from packageA и class B from packageB , оба из которых являются классами S4, и я хочу создать свои собственные функции преобразования в / из A <-> B (при условии, что ни один из пакетов не определил функцию преобразования в / из класса другого пакета).

Если я попытаюсь добавить что-то вроде этого:

 setAs("A", "B", function(from) castAtoB(from))
setAs("B", "A", function(from) castBtoA(from))
 

А затем установите и загрузите пакет, методы будут недоступны — например, что-то вроде этого:

 library(methods)
library(packageA)
library(packageB)
library(myPackage)

objA <- packageA::createObjA()
as(objA, "B")
 

Завершится ошибкой с сообщением типа:

 Error in as(objA, "B") : 
  no method or default for coercing “A” to “B”
 

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

Комментарии:

1. function(from) myfun(from) может быть заменен просто myfun в setAs вызове. То же самое для аналогичных функций ( castAtoB и наоборот).

2. в вашем примере вы фактически не загрузили свой пакет. Это было намеренно?

3. @JDL извините, добавил это в код, хотя это не имеет значения, когда я пытаюсь запустить какой-то подобный код.

Ответ №1:

Я отвечу сам: для того, чтобы это работало, требуется добавить следующую строку в DESCRIPTION файл:

 export()
 

Тогда он работает правильно.