扩展 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
设置一个。不过,此修改后的对象仍将无法通过任何有效性检查,因此这可能非常不稳定。
我有一个 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
设置一个。不过,此修改后的对象仍将无法通过任何有效性检查,因此这可能非常不稳定。