设置参考类的通用函数

时间:2013-09-17 13:40:30

标签: r reference-class

我得到以下错误,我认为这是因为解释器认为我调用函数.self$getFields

a<-A$new(var1=list(B$new(var1="a"),B$new(var1="b")))
a$test()
[1] Error in getFields(l, c("var1")) : unused argument (c("var1"))



  AB.getFields<-function(keys){
  vars<-mget(names(.refClassDef@fieldClasses), envir = attr(.self, ".xData"))
  return(vars[keys])
}

B<-setRefClass(Class = "B"
              ,fields = list(var1 = "character")
              ,methods = list(getFields=AB.getFields
                               ,initialize=function(...) {
                                   usingMethods("getFields")
                                   callSuper(...)
                                 }
                               )
)

A<-setRefClass(Class = "A"
              ,fields = list(var1 = "list")
              ,methods = list(getFields=AB.getFields,
                              test=function() {
                                  getFields(.self$var1,c("var1"))
                                 }))

setGeneric("getFields", function(object, ...) standardGeneric("getFields"))
setMethod(getFields, "list", function(object, ...) lapply(object,function(e,...) e$getFields(...)))

1 个答案:

答案 0 :(得分:1)

好的,正如您所怀疑的那样,问题是Ref类方法名称和泛型函数名称之间的冲突名称。

例如,这可以解决问题(在控制台中,可能不在包中):

A<-setRefClass(Class = "A"
               ,fields = list(var1 = "list")
               ,methods = list(getFields=AB.getFields,
                               test=function() {
                                 fx <- get('getFields', 1)
                                 fx(.self$var1,c("var1"))
                               }
              )
)

在我看来,最好的方法是以不同的方式命名你的ref类方法。例如get_fields。