引用类,选项卡完成和强制方法定义

jdh*_*son 7 r s4 reference-class

我目前正在使用引用类编写包.我通过阅读各种来源遇到了一个问题:

R参考类中的方法初始化

在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()
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)

所以现在addonefieldshow作为选项提出.

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那样感觉有点不对劲.有没有人以前处理过这个问题.

有没有更好的方法来解决方案?如果问题被过度提出,感谢您的任何建议和道歉.

Mar*_*gan 6

我想知道你的目标是什么?功能名称显示标签完成?然后值得一个帖子到R-devel邮件列表并提供功能请求.原方案更优雅与处理usingMethods的记录上?setRefClass.一个持续的黑客可能是

initialize = function(...) {
    methods <- getRefClass(class(.self))$methods()
    eval(parse(text=paste0(".self$", methods)))
    callSuper(...)
}
Run Code Online (Sandbox Code Playgroud)

标签完井可以通过定制.DollarNamesutils包,因此

.DollarNames.TEST <- function(x, pattern)
    grep(pattern, getRefClass(class(x))$methods(), value=TRUE)
Run Code Online (Sandbox Code Playgroud)

也许可以在类层次结构的基础上编写S3方法?