1
在R中定义新的参考类时,会出现一堆锅炉板方法(按R约定),如length
,show
等当这些被定义的时候,它们在类的方法中调用时会大量地掩盖类似的命名方法/函数。由于您不一定知道外部函数的名称空间,因此无法使用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
我知道有可能将自己的调度写入正确的方法/函数,但这似乎是这样一种常见情况,我认为它可能已经在方法包中解决了(usingMethods()
的反向排序)
因此,我的问题是,如果以前不清楚,我很抱歉:是否有方法忽略方法定义中的引用类方法和字段,并完全依赖.self来访问它们,以便定义方法/函数课外不掩饰?
在我看来,你总是知道外国功能的命名空间。你可以从帮助页面看到它。在你的例子中'base :: length(data)'就足以使它工作。 – nicola 2014-10-05 06:48:04
在知道输入是列表的情况下,是的。但想象一下用户提供数据的情况,即长度不在其中一个字段上调用,因此您不知道传入的内容。您可能允许一种方法接受在不同包中定义的几个不同对象。为了使用'::',你需要检查对象并进行手动调度 - R通常会为你做。 – ThomasP85 2014-10-05 07:10:55
@ ThomasP85你的例子并不清楚,你最后的评论也是。你正在使用类来明确地设置数据的类型(在这里是一个列表),所以你怎么能不知道它的类型? – agstudy 2014-10-05 07:16:01