扩展 R S4 对象以拥有新的插槽并保持原始对象以相同的方式工作

Ada*_*ice 4 oop r object s4

我有一个“DESeqResults”类的 S4 对象。本质上,我希望能够向该对象添加新信息。理想情况下,我只想为其添加一些插槽,以便我可以存储以下内容:

myDESet@new_slot = 5 
Run Code Online (Sandbox Code Playgroud)

我开始认为我必须创建一个继承“ DESeqResults”的子类,虽然我还不确定如何在 R 中做到这一点,但我更关心如何从原始对象中保留数据完整。

本质上,一个库正在制作和使用这个“D ESeqResults”类对象,在它被创建并拥有一些数据之后,它将被用于很多功能。在创建其中之一之后,我只想向对象添加一些新信息。如果我创建一个扩展这个类并有额外插槽的类,我如何将所有现有数据从类的原始实例转移到子类的新实例中?

实现我在这里要做的事情的最佳方法是什么?是否可以在实例化任何对象之前修改原始类,以便在创建它们时具有我需要的额外插槽?还是有其他方法可以实现这一目标?

非常感谢!

JDL*_*JDL 7

通常的做法是定义父类的新类:

setClass(
  "myDESRclass",
  contains="DESeqResults",
  slots=c(new_slot="numeric")
) -> myDESRclass
Run Code Online (Sandbox Code Playgroud)

然后您可以使用as将对象转换为您的类:

## x is some DESeqResults object
x <- as(x,"myDESRclass")
x@new_slot <- 5
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,您必须调用setAs或 类似方法,但由于 DESeqResults 是超类,因此该as方法由 R 预先定义,并按预期工作。

如果您不想采用这种方法,有两种选择,但它们不太安全:

1) 使用 S3 而不是 S4。听起来您并不“拥有” DESeqResults 类,因此这可能很困难,但myDESet$new_slot <- 5不会出错。

2) 插槽是作为属性实现的,因此您可以使用attr(myDESet,"new_slot") <- 5. 尽管如此,这个修改过的对象仍然无法通过任何有效性检查,因此这可能非常不稳定。