我有一个“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/