【问题标题】:Using a method/function within a reference class method of the same name在同名的引用类方法中使用方法/函数
【发布时间】:2014-10-05 06:33:25
【问题描述】:

在 R 中定义新的引用类时,会出现一堆样板方法(按 R 约定),例如 lengthshow 等。定义这些时,它们会积极掩盖类似的命名方法/functions 从类的方法中调用时。由于您不一定知道外部函数的命名空间,因此无法使用 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

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

因此,我的问题是,如果之前不清楚,我深表歉意:是否有方法可以忽略方法定义中的引用类方法和字段,并仅依靠 .self 来访问这些,以便定义方法/函数课外不蒙面?

【问题讨论】:

  • 在我看来,你总是知道外来函数的命名空间。例如,您可以从帮助页面中看到它。在您的示例中,base::length(data) 足以使其正常工作。
  • 如果你知道输入是一个列表,是的。但是想象一下用户提供数据的情况,即长度没有在一个字段上调用,所以你不知道传入了什么。你可能允许一个方法接受不同包中定义的几个不同对象。为了使用::,您需要检查对象并进行手动调度——R 通常会为您做这件事。
  • @ThomasP85 您的示例不清楚,您的最后评论也是如此。您正在使用类来显式设置数据的类型(这里出现的是一个列表),那么您怎么能不知道它的类型呢?

标签: r oop dispatch reference-class


【解决方案1】:

这个例子不是很清楚。我不知道你为什么不知道你的方法的命名空间。不管怎样,这里有几种方法可以解决这个问题:

  1. 您可以为引用类方法 Length 使用不同的名称,例如大写“L”
  2. 您可以动态查找泛型函数的命名空间。

例如:

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

例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-31
    • 1970-01-01
    • 2015-04-26
    • 2012-05-02
    相关资源
    最近更新 更多