问题描述
thing <- R6Class("youngThing",private = list(
..age = 0),active = list(
age = function(){
private$..age <- private$..age + 1
private$..age
}
)
)
这给了我一个简单的R6对象,其中,每次调用有效的..age
字段时,age
都会增加1:
a_thing <- thing$new()
a_thing$age
# [1] 1
在给定私有字段..age
的阈值的情况下,我希望a_thing的对象类更改,如下所示:
class(a_thing)
# [1] "youngThing" "R6"
for(timestep in 1:10){
if(a_thing$age >5 & ! inherits(a_thing,"olderThing")){
class(a_thing) <- c("olderThing",class(a_thing))
}
}
class(a_thing)
# [1] "olderThing" "youngThing" "R6"
但是,我希望这种情况在对象内发生。有没有办法将其作为活动绑定包含在对象生成器中,以便由此创建的任何对象都将内置此功能?
NB。最好将阈值类别添加到对象中。不会取代现有的类。
解决方法
您可以更改self
的类别。
library(R6)
thing <- R6Class(
"youngThing",private = list(..age = 0),active = list(
age = function() {
private$..age <- private$..age + 1
if(private$..age > 5 && !inherits(self,"olderThing")){
class(self) <- c("olderThing",class(self))
}
private$..age
}
)
)
a_thing
是age <= 5
的原始课程。
a_thing <- thing$new()
a_thing$age; a_thing$age; a_thing$age; a_thing$age; a_thing$age
#> [1] 2
#> [1] 3
#> [1] 4
#> [1] 5
class(a_thing)
#> [1] "youngThing" "R6"
然后更新到5
之后。
a_thing$age
#> [1] 6
class(a_thing)
#> [1] "olderThing" "youngThing" "R6"