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

Extend an R S4 object to have new slots and keep the original object working the same way

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

myDESet@new_slot = 5 

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

本质上,一个库正在创建和使用这个 "DESeqResults" class 对象,在创建并拥有一些数据之后,它将用于许多功能。在创建其中一个之后,我只想向该对象添加一些新信息。如果我制作一个扩展此 class 并具有额外插槽的 class,我如何将所有现有数据从 class 的原始实例传输到子 [=] 的新实例25=]?

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

非常感谢!

通常的做法是定义一个新的 subclass of the parent class:

setClass(
  "myDESRclass",
  contains="DESeqResults",
  slots=c(new_slot="numeric")
) -> myDESRclass

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

## x is some DESeqResults object
x <- as(x,"myDESRclass")
x@new_slot <- 5

在大多数情况下,您必须调用 setAs 或类似的方法,但因为 DESeqResults 是一个超级 class,as 方法由 R 预先定义,并且作为打算。

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

1) 使用 S3 而不是 S4。听起来您没有 "own" DESeqResults class,所以这可能很困难,但 myDESet$new_slot <- 5 不会出错。

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