如何组合或修改S4对象?

时间:2017-04-13 17:42:39

标签: r s4

我正在努力寻找一种简单的方法来修改具有许多插槽的S4对象。一个玩具的例子是:

setClass(
    Class = "First",
    slots = c(foo = "numeric")
)
setClass(
    Class = "Second",
    slots = c(bar = "numeric"),
    contains = "First"
)
dog <- new(Class="First",
           foo = 1)
cat <- new(Class="Second", 
           foo = dog@foo,
           bar = 1)
str(cat)

这很简单,因为第一类只包含一个插槽(foo)。是否有一种简单的方法来组合/修改包含许多插槽的S4对象?

2 个答案:

答案 0 :(得分:0)

看起来您正在尝试使用父类实例的值来实例化子类。我不认为有一种简单的方法可以做到这一点,但它可以做到。在这里,我们检索父类实例槽值,并使用do.call来实例化子类对象:

par.slots <- sapply(slotNames(dog), slot, object=dog, simplify=F)
do.call("new", c("Second", bar=1, par.slots))

## An object of class "Second"
## Slot "bar":
## [1] 1
## 
## Slot "foo":
## [1] 1

答案 1 :(得分:-1)

是的,大多数创建S4对象的人都会创建各种方法来处理它们,这些方法最倾向于为您的目的操作数据。

有时,通过创建一个全新的特定于类的方法来完成特定任务,有些则通过创建do来指示R应用现有泛型函数的特定于类的实现(例如rbindsummary)您可以在此处阅读:

Bioconductor S4 Tutorial

这应该让您朝着正确的方向前进,创建自己的功能或自定义现有的泛型来处理对象。

相关问题