我正在努力寻找一种简单的方法来修改具有许多插槽的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对象?
答案 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应用现有泛型函数的特定于类的实现(例如rbind
或summary
)您可以在此处阅读:
这应该让您朝着正确的方向前进,创建自己的功能或自定义现有的泛型来处理对象。