在其他包的 S4 类之间创建转换方法
Posted
技术标签:
【中文标题】在其他包的 S4 类之间创建转换方法【英文标题】:Create conversion methods between S4 classes from other packages 【发布时间】:2021-01-10 16:31:37 【问题描述】:假设我想创建一个 R 包,它在 S4 类在其他包中定义之间定义强制方法 (methods::as
)。
当我使用自己的 S4 类创建包时,我可以像这样添加与其他类的转换:
setAs("MyClass", "OtherClass", function(from) myfun(from))
只要类被正确导出,一旦加载包,这些就可以正常工作。
但是现在假设我想从packageA
获取A
类,从packageB
获取B
类,这两个都是S4 类,我想创建自己的与@ 之间的转换函数987654327@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”
如何注册这些方法,以便在加载我的包时可以使用它们?
【问题讨论】:
function(from) myfun(from)
可以在 setAs
调用中被 myfun
替换。类似的功能也一样(castAtoB
反之亦然)。
在你的例子中,你还没有真正加载你的包。这是故意的吗?
@JDL 抱歉,在代码中添加了它,尽管当我尝试运行类似的代码时它没有任何区别。
【参考方案1】:
我会回答自己:要让它工作需要在DESCRIPTION
文件中添加以下行:
export()
然后它就可以正常工作了。
【讨论】:
以上是关于在其他包的 S4 类之间创建转换方法的主要内容,如果未能解决你的问题,请参考以下文章