手动修改Reference Class实例的类定义

时间:2014-03-19 15:08:28

标签: r reference-class

我知道这将是一个非常不可靠的黑客攻击。但出于纯粹的兴趣:

如果已经实例化的对象的引用类定义发生了变化,并且您希望它被告知有关更新的信息,那么您需要手动更改ref类对象的.refClassDef字段?" 34; (没有重新实例化)。

毕竟,如果引入了其他方法,它似乎确实有效,但不能修改现有的方法(参见下面的示例)。

这个问题与我在post中的答案有关。


实施例

原始课程def:

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

实例化:

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

更新了课程def:

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

实例可以使用新方法:

my_object$print_goodbye()
[1] "goodbye"

但是,例如,print_hello未能及时了解{{1}}中的更改。

1 个答案:

答案 0 :(得分: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)
      }
    }
    )
  )

更新:11月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')