我知道这将是一个非常不可靠的黑客攻击。但出于纯粹的兴趣:
如果已经实例化的对象的引用类定义发生了变化,并且您希望它被告知有关更新的信息,那么您需要手动更改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}}中的更改。
答案 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')