在其他包的 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 类之间创建转换方法的主要内容,如果未能解决你的问题,请参考以下文章

XML和实体类之间的转换

将“规范”S3 类转换为新的 S4 类

如何将类方法转换为两个模型之间的关系?

Java 中基本类型和字符串之间的转换

类型转换之转String

Java基础(36):String与基本数据类型之间的双向转换