私は単純なR6オブジェクトジェネレータを持っています:
thing <- R6Class("youngThing",
private = list(
..age = 0),
active = list(
age = function(){
private$..age <- private$..age + 1
private$..age
}
)
)
これにより..age
、アクティブage
フィールドが呼び出されるたびに1ずつ増加する単純なR6オブジェクトが得られます。
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"
ただし、これをオブジェクト内で発生させたいと思います。これをオブジェクトジェネレーターのアクティブバインディングとして含めて、そこから作成されたオブジェクトにこの機能が組み込まれるようにする方法はありますか?
注意。しきい値クラスをオブジェクトに追加することをお勧めします。既存のクラスを置き換えないこと。
のクラスを変更できます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"
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加