关于r:在同名的引用类方法中使用方法/函数

Using a method/function within a reference class method of the same name

在R中定义一个新的引用类时,有一组期望的锅炉板方法(按R约定),如lengthshow等。当定义这些方法时,它们会在从类的方法中调用时积极地屏蔽类似的命名方法/函数。由于您不一定知道外部函数的名称空间,因此不可能使用package::说明符。

有没有一种方法可以告诉一个方法忽略它自己的方法,除非专门使用.self$调用?

例子:

1
2
3
4
5
6
7
8
9
10
11
12
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类),但这似乎与引用类的思想相反……

编辑:为了避免将重点放在事先知道数据类的实例上,请考虑以下示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

我知道您可以将自己的调度写到正确的方法/函数,但这似乎是一种常见的情况,我认为它可能已经在方法包中解决了(类似于usingMethods())。

因此,我的问题是,如果之前不清楚的话,我道歉:是否有方法可以忽略方法定义中的引用类方法和字段,并且完全依赖于这些方法和字段。自我访问这些方法,这样类外部定义的方法/函数就不会被屏蔽?


这个例子不太清楚。我不知道你为什么不知道你的方法的名称空间。不管怎样,这里有一些解决这个问题的方法:

  • 例如,可以对引用类方法Length使用不同的名称,并使用大写字母"l"。
  • 您可以动态地找到通用函数的名称空间。
  • 例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      methods = list(
        .show =function(data) {
          ns = sub(".*:","",getAnywhere("show")$where[1])
          func = get("show",envir = getNamespace(ns))
          func(data)
        },
        show=function() {
          .show(data)
        }
      )
  • 您可以使用新的引用类系统R6。
  • 例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    tC6 <- R6Class('testClass',
      public = list(
        data=NA,
        initialize = function(data) {
          if (!missing(data)) self$data <- data
        },
        show=function()   show(self$data)
      )
    )