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

标签 r oop object s4

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

myDESet@new_slot = 5 

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

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

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

非常感谢!

最佳答案

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

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

然后你可以使用 as将对象转换为您的类:
## x is some DESeqResults object
x <- as(x,"myDESRclass")
x@new_slot <- 5

在大多数情况下,您必须调用 setAs或类似但因为 DESeqResults 是父类(super class) as方法由 R 预定义,并按预期工作。

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

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

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

关于r - 扩展 R S4 对象以具有新插槽并保持原始对象以相同方式工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46774024/

相关文章:

r - R : `[.data.frame` (m. 数据中的错误,处理):选择了未定义的列 - 运行中介

python - 频率值的 R 分位数

python - 元组的问题

java - Java中构造函数的调用

Java:从类创建对象

javascript - 如何拥有一个属于某物属性的类?

javascript - 如何将 JavaScript 对象复制到新变量而不是通过引用?

r - 翻转图例的顺序而不改变情节中的顺序

Rcpp 将长度为 0 (NULL) 的向量传递给 cppfunction

python - 如何知道一个类的成员是否是一个方法?