R:在对象生成器中使用主动绑定有条件地向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

在给定私有字段..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_thingage <= 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"