#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()
Тогда он работает правильно.