我目前正在使用参考类编写一个包。我在阅读各种资料时遇到了一个问题:
无法在 Snowfall 中可靠地使用 RefClass 方法
我认为是因为引用方法并非全部复制到类中的每个对象,而是在第一次访问时被复制。
https://stat.ethz.ch/pipermail/r-devel/2011-June/061261.html
例如定义:
test <- setRefClass("TEST",
fields = list( a = "numeric"),
methods = list(
addone = function(){
a <<- a+1
},
initialize = function(){
a <<- 1
}
)
)
example <- test$new()
所以 example 是 class 的一个新对象TEST
。example$
在控制台中键入和制表符给出
> example$
# example$.->a example$.refClassDef example$.self
# example$a example$initialize
因此该方法addone
未作为选项提供。但是可以调用:
example$addone()
现在标签再次显示
# >
# > example
# Reference class object of class "TEST"
# Field "a":
# [1] 2
# > example$
# example$.->a example$.refClassDef example$.self
# example$a example$addone example$field
# example$initialize example$show
所以现在addone
和field
和show
作为选项呈现。
Martin Morgan 建议在上述链接之一中强制定义方法。这很好用
test <- setRefClass("TEST",
fields = list( a = "numeric"),
methods = list(
addone = function(){
a <<- a+1
},
initialize = function(){
a <<- 1
.self$addone #force definition
}
)
)
example <- test$new()
所以现在制表符给出:
# > example$
# example$.->a example$.refClassDef example$.self
# example$a example$addone example$initialize
我的一些课程有超过 30 种方法,所以我想尽可能简洁地做到这一点。我已经定义:
test <- setRefClass("TEST",
fields = list( a = "numeric"),
methods = list(
addone = function(){
a <<- a+1
},
initialize = function(){
a <<- 1
eval(parse(text=paste0('.self$',ls(test$def@refMethods))))
}
)
)
example <- test$new()
制表符现在给出:
# > example$
# example$.->a example$.refClassDef example$.self
# example$a example$addone example$callSuper
# example$copy example$export example$field
# example$getClass example$getRefClass example$import
# example$initFields example$initialize example$show
# example$trace example$untrace
虽然这有效,但感觉有点笨拙。也test$def@refMethods
被使用而不是getRefClass("TEST")$def@refMethods
这样,感觉有点不对劲。以前有没有人处理过这个问题。
有没有更好的方法来解决问题?如果问题过于冗长,感谢您的任何建议和道歉。