R:オブジェクトジェネレータでアクティブバインディングを使用して、R6オブジェクトに新しいクラスを条件付きで追加します

ジェイブ

私は単純な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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ