如何使用方法在S4对象r中设置值(不需要输入值)

cha*_*non 6 oop r s4

这是两部分的问题.我想基于不同的槽值设置原型s4对象的值,或者我想将其作为方法实现.

我有一个我想要创建的对象.它有一些插槽.我想根据从另一个插槽输入的值设置一个插槽值.这是我想要做的简化版本.

setClass("Person",
    representation(name = "character", age = "numeric", doubleAge = "numeric"),
    prototype(name = "Bob", age = 5, doubleAge = 10) )
Run Code Online (Sandbox Code Playgroud)

现在我想创建一个对象,但是根据年龄槽设置doubleAge值.

p1 <- new("Person", name = "Alice", age = 6)
Run Code Online (Sandbox Code Playgroud)

我知道了

An object of class "Person"                                                                                                      
Slot "name":                                                                                                                     
[1] "Alice"                                                                                                                  

Slot "age":                                                                                                                    
[1] 6                                                                                                                        

Slot "doubleAge":                                                                                                              
[1] 10       
Run Code Online (Sandbox Code Playgroud)

但我想看看doubleAge是12.在原型,我不知道如何改变doubleAge = 10为类似doubleAge = 2*age

所以作为一个解决方案,我试图创建一个设置函数init,在创建后设置值.这是第2部分的问题.

setGeneric("init", "Person", function(object) {
    standardGeneric("init")
}
setMethod("init","Person", function(object) {
    object@doubleAge <- object@age*2
    object
}
Run Code Online (Sandbox Code Playgroud)

如果我object@doubleAge在方法中打印它返回12但似乎范围结束,因为它返回时为10

目前有效的方法非常相似,但不正确.

setGeneric("init<-", "Person", function(object) {
    standardGeneric("init<-")
}
setMethod("init<-","Person", function(object) {
    object@doubleAge <- object@age*2
    object
}
Run Code Online (Sandbox Code Playgroud)

但是我必须打电话init(p1) <- NULL,这似乎很奇怪.我知道这个例子似乎微不足道,但它只是一个更复杂的现实世界问题的准确例子.

MrF*_*ick 4

似乎覆盖初始化方法对我有用。例如

setClass("Person",
         representation(name = "character", age = "numeric", doubleAge = "numeric"),
         prototype(name = "Bob", age = 5, doubleAge = 10) )

setMethod("initialize", "Person", function(.Object, ...) {
  .Object <- callNextMethod()
  .Object@doubleAge <- .Object@age*2
  .Object
})

(p1 <- new("Person", name = "Alice", age = 6))
# An object of class "Person"
# Slot "name":
# [1] "Alice"
# Slot "age":
# [1] 6
# Slot "doubleAge":
# [1] 12
Run Code Online (Sandbox Code Playgroud)

运行callNextMethod()“默认”初始值设定项来设置我们不会弄乱的所有值。然后我们只需更改我们想要的值并返回更新后的对象。