问题描述
假设我想创建一个 R 包,它定义了在其他包中定义的 S4 类之间的强制方法(methods::as
)。
当我使用自己的 S4 类创建包时,我可以添加与其他类的转换,如下所示:
setAs("MyClass","OtherClass",function(from) myfun(from))
一旦包被加载,这些就可以正常工作,前提是类被正确导出。
但是现在假设我想从 A
中获取 packageA
类,从 B
中获取 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”
解决方法
我会自己回答:要使其正常工作需要在 DESCRIPTION
文件中添加以下行:
export()
然后它就可以正常工作了。