2

これがひどく信頼性の低いハックであることは承知しています。しかし、純粋な興味から:

.refClassDef既にインスタンス化されたオブジェクトの参照クラス定義が変更され、(再インスタンス化せずに)「更新について通知される」ようにしたい場合、参照クラス オブジェクトのフィールドで手動で何を変更する必要がありますか?

結局のところ、追加のメソッドが導入された場合は機能するように見えますが、既存のメソッドの変更では機能しません (以下の例を参照)。

この質問は、この投稿の私の回答に関連しています。


元のクラス定義:

MyReferenceClass <- setRefClass("MyReferenceClass",
    methods = list(
        print_hello = function(){
            print("hello")
        }
    )
)

インスタンス化:

my_object <- MyReferenceClass$new()
my_object$print_hello()
[1] "hello"

更新されたクラス定義:

MyReferenceClass <- setRefClass("MyReferenceClass",
    methods = list(
        print_hello = function(){
            print("hello_again")
        },
        print_goodbye = function(){
            print("goodbye")
        }
    )
)

インスタンスは新しいメソッドを使用できます:

my_object$print_goodbye()
[1] "goodbye"

print_helloただし、たとえば、この投稿が示すように、変更について通知されない可能性があります。

4

1 に答える 1

1

updateクラスにメソッドを含めます (変更前と変更後) 。obj$update()クラスの更新時に別のメソッドを呼び出す前に呼び出します。

MyReferenceClass <- setRefClass(
  "MyReferenceClass",
  methods = list(
    print_hello = function(){
      print("hello")
    },
    update = function(){
      selfEnv <- as.environment(.self)
      .class <- as.character(class(.self))
      for (e in as.vector(utils::lsf.str(selfEnv))){ 
        v <- get(e,eval(parse(text=sprintf("%s@generator$def@refMethods",.class))))
        assign(e,v,envir=selfEnv)
      }
    }
    )
  )

更新: 6 月 11 日水曜日メソッドは、内部メソッドのupdate誤った変更を避けるために、更新するメソッドのベクトルを要求するようになりました。これを指摘してくれた@Rappsterに感謝します。

MyReferenceClass <- setRefClass(
  "MyReferenceClass",
  methods = list(
    print_hello = function(){
      print("hello")
    },
    update = function(x){
      selfEnv <- as.environment(.self)
      .class <- as.character(class(.self))
      for (e in x){
        v <- get(e,eval(parse(text=sprintf("%s@generator$def@refMethods",.class))))
        assign(e,v,envir=selfEnv)
      }
    }
    )
  )

obj <- MyReferenceClass$new()
obj$print_hello()

## ...
obj$update('print_hello')
于 2014-04-03T17:47:54.320 に答える