在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
我知道可以将自己的调度编写到正确的方法/函数中,但这似乎是一种常见的情况,我认为它可能已经在方法包中解决了(与{的反向排序) {1}})
我的问题是,如果之前不清楚,我道歉:是否有方法忽略方法定义中的引用类方法和字段,并且仅依靠.self来访问它们,以便定义方法/函数课外没有蒙面?
答案 0 :(得分:1)
示例不是很清楚。我不知道你为什么不知道你的方法的命名空间。无论如何,这里有几种解决这个问题的方法:
Length
,例如资本“L”例如:
methods = list(
.show =function(data) {
ns = sub(".*:","",getAnywhere("show")$where[1])
func = get("show",envir = getNamespace(ns))
func(data)
},
show=function() {
.show(data)
}
)
例如:
tC6 <- R6Class('testClass',
public = list(
data=NA,
initialize = function(data) {
if (!missing(data)) self$data <- data
},
show=function() show(self$data)
)
)