【发布时间】:2012-09-22 11:01:03
【问题描述】:
我目前正在使用引用类编写一个包。我遇到过 通过阅读各种来源的问题:
Method initialisation in R reference classes
Can't reliably use RefClass methods in Snowfall
我收集是因为引用方法没有全部复制到每个对象 在类中,而不是在第一次访问时复制它们。
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()
所以示例是类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()
tab 现在给出:
# > 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 以便
感觉有点不对。以前有没有人处理过这个问题。
有没有更好的方法来解决问题?如果问题过于冗长,感谢您的任何建议和道歉。
【问题讨论】:
标签: r s4 reference-class