【发布时间】:2014-10-05 06:33:25
【问题描述】:
在 R 中定义新的引用类时,会出现一堆样板方法(按 R 约定),例如 length、show 等。定义这些时,它们会积极掩盖类似的命名方法/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