这是两部分的问题.我想基于不同的槽值设置原型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,这似乎很奇怪.我知道这个例子似乎微不足道,但它只是一个更复杂的现实世界问题的准确例子.
似乎覆盖初始化方法对我有用。例如
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()“默认”初始值设定项来设置我们不会弄乱的所有值。然后我们只需更改我们想要的值并返回更新后的对象。