jdh*_*son 7 r s4 reference-class
我目前正在使用引用类编写包.我通过阅读各种来源遇到了一个问题:
我收集是因为引用方法并非全部复制到类中的每个对象,而是在首次访问时复制它们.
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()
Run Code Online (Sandbox Code Playgroud)
所以示例是类的新对象TEST.example$在控制台中键入和标签给出
> example$
# example$.->a example$.refClassDef example$.self
# example$a example$initialize
Run Code Online (Sandbox Code Playgroud)
所以该方法addone不作为选项提供.但它可以打电话:
example$addone()
Run Code Online (Sandbox Code Playgroud)
现在标签再次显示
# >
# > 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
Run Code Online (Sandbox Code Playgroud)
所以现在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()
Run Code Online (Sandbox Code Playgroud)
所以现在tabbing给出:
# > example$
# example$.->a example$.refClassDef example$.self
# example$a example$addone example$initialize
Run Code Online (Sandbox Code Playgroud)
我的一些课程有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()
Run Code Online (Sandbox Code Playgroud)
标签现在给出:
# > 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
Run Code Online (Sandbox Code Playgroud)
虽然这有效但感觉有点笨拙.也test$def@refMethods使用而不是getRefClass("TEST")$def@refMethods那样感觉有点不对劲.有没有人以前处理过这个问题.
有没有更好的方法来解决方案?如果问题被过度提出,感谢您的任何建议和道歉.
我想知道你的目标是什么?功能名称显示标签完成?然后值得一个帖子到R-devel邮件列表并提供功能请求.原方案更优雅与处理usingMethods的记录上?setRefClass.一个持续的黑客可能是
initialize = function(...) {
methods <- getRefClass(class(.self))$methods()
eval(parse(text=paste0(".self$", methods)))
callSuper(...)
}
Run Code Online (Sandbox Code Playgroud)
标签完井可以通过定制.DollarNames的utils包,因此
.DollarNames.TEST <- function(x, pattern)
grep(pattern, getRefClass(class(x))$methods(), value=TRUE)
Run Code Online (Sandbox Code Playgroud)
也许可以在类层次结构的基础上编写S3方法?