R:在对象生成器中使用主动绑定有条件地向 R6 对象添加新的 class
R: Use active binding in object generator to conditionally add new class to R6 objects
我有一个简单的 R6 对象生成器:
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
我希望 a_thing 的对象 class 改变给定私有字段 ..age
的阈值,如下所示:
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"
但是,我希望这发生在对象内。有没有办法将其作为对象生成器中的活动绑定包含在内,以便从中创建的任何对象都将具有内置功能?
注意。优选在对象上加上阈值class;它不会取代现有的 classes.
您可以更改 self
的 class。
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
是原来的 class 而 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"
我有一个简单的 R6 对象生成器:
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
我希望 a_thing 的对象 class 改变给定私有字段 ..age
的阈值,如下所示:
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"
但是,我希望这发生在对象内。有没有办法将其作为对象生成器中的活动绑定包含在内,以便从中创建的任何对象都将具有内置功能?
注意。优选在对象上加上阈值class;它不会取代现有的 classes.
您可以更改 self
的 class。
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
是原来的 class 而 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"