如何更新 R6 类实例的方法定义?
正如我所料,S3 使用当前的方法定义。使用 R5(参考类),我可以使用 myInstance=myInstance$copy()。使用 R6,我尝试了 myInstance = myInstance$clone() 但 myInstance$someMethod() 仍然调用旧代码。
当我从在长时间运行的进程上创建的转储中加载对象实例时,我需要这个。我想在长时间运行的计算后调试和更改对象状态的代码。因此,我不能只创建一个新实例并重新运行初始化。甚至比 R5 复制方法(不更新对实例的引用)更好的方法是将类和所有超类的当前定义的行为(即方法定义)分配给实例。
这是一个例子:
library(R6)
Person <- R6Class("Person",
lock_objects=FALSE,
public = list(
name = NULL,
initialize = function(name = NA, hair = NA) {
self$name <- name
self$greet()
},
greet = function() {
cat(paste0("Hello, my name is ", self$name, ".\n"))
}
)
)
# create an instance
thomas <- Person$new("Thomas","brown")
# modify the behaviour of Person
Person <- R6Class("Person",
lock_objects=FALSE,
public = list(
name = NULL,
initialize = function(name = NA, hair = NA) {
self$name <- name
self$greet()
},
greet = function() {
cat(paste0("Modified greet from ", self$name, ".\n"))
}
)
)
t1 <- Person$new("t1") # greet function updated
t2 <- thomas$clone()
t2$greet() # greet function not updated in thomas nor t2