在同名的引用类方法中使用方法/函数

时间:2014-10-05 06:33:25

标签: r oop dispatch reference-class

在R中定义一个新的引用类时,有一堆预期的锅炉板方法(通过R约定),例如lengthshow等。当它们被定义时它们是积极的从类的方法中调用时,屏蔽类似的命名方法/函数。由于您不一定知道外部函数的名称空间,因此无法使用package::说明符。

除非专门使用.self $?

调用,否则有办法告诉方法忽略它自己的方法

示例:

tC <- setRefClass(
  'testClass',
  fields = list(data='list'),
  methods = list(
    length=function() {
      length(data)
    }
  )
)

example <- tC(data=list(a=1, b=2, c=3))
example$length()    # Will cause error as length is defined without arguments

或者,可以采用为类定义S4方法(因为引用类是引擎盖下的S4类),但这似乎与引用类的想法有效...

编辑: 为了避免关注事先知道数据类的实例,请考虑以下示例:

tC <- setRefClass(
  'testClass',
  fields = list(data='list'),
  methods = list(
    length=function() {
      length(data)
    },
    combineLengths = function(otherObject) {
      .self.length() + length(otherObject)
    }
  )
)

example <- tC(data=list(a=1, b=2, c=3))
example$combineLength(rep(1, 3))    # Will cause error as length is defined without arguments

我知道可以将自己的调度编写到正确的方法/函数中,但这似乎是一种常见的情况,我认为它可能已经在方法包中解决了(与{的反向排序) {1}})

我的问题是,如果之前不清楚,我道歉:是否有方法忽略方法定义中的引用类方法和字段,并且仅依靠.self来访问它们,以便定义方法/函数课外没有蒙面?

1 个答案:

答案 0 :(得分:1)

示例不是很清楚。我不知道你为什么不知道你的方法的命名空间。无论如何,这里有几种解决这个问题的方法:

  1. 您可以使用不同的名称作为参考类方法Length,例如资本“L”
  2. 您可以动态查找泛型函数的命名空间。
  3. 例如:

      methods = list(
        .show =function(data) {
          ns = sub(".*:","",getAnywhere("show")$where[1])
          func = get("show",envir = getNamespace(ns))
          func(data)
        },
        show=function() {
          .show(data)
        }
      )
    
    1. 您可以使用新的参考类系统R6
    2. 例如:

      tC6 <- R6Class('testClass',
        public = list(
          data=NA,
          initialize = function(data) {
            if (!missing(data)) self$data <- data
          },
          show=function()   show(self$data)
        )
      )