【问题标题】:Manual modifications of the class definition of a Reference Class instance手动修改参考类实例的类定义
【发布时间】:2014-03-19 15:08:28
【问题描述】:

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

如果已实例化对象的引用类定义发生更改并且您希望它“获悉更新”(无需重新实例化),您需要手动更改引用类对象的 .refClassDef 字段它)。

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

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


示例

原始类定义:

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 的变化,正如post 所示。

【问题讨论】:

    标签: r reference-class


    【解决方案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')
    

    【讨论】:

    • 不错的方法!但我认为手动分配会破坏内部自引用结构:一旦您运行update(),则在后续调用中没有任何方法能够使用/找到.self。只需尝试连续运行两次update()。关于如何解决这个问题的任何想法?
    • @Rappster 抱歉回来晚了。是的,由于内部方法的变化,在盲目制作update时确实存在一些冲突。我将更新代码以仅允许更新自定义指定的方法。
    猜你喜欢
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    相关资源
    最近更新 更多