R 在同名的引用类方法中使用方法/函数
在R中定义一个新的引用类时,有一堆锅炉板方法(按R约定),如R 在同名的引用类方法中使用方法/函数,r,oop,dispatch,reference-class,R,Oop,Dispatch,Reference Class,在R中定义一个新的引用类时,有一堆锅炉板方法(按R约定),如length,show等。当这些方法被定义时,它们在类的方法中调用时会积极屏蔽类似的命名方法/函数。由于您不一定知道外部函数的名称空间,因此无法使用包::说明符 有没有办法告诉一个方法忽略它自己的方法,除非使用.self$专门调用它 例如: tC <- setRefClass( 'testClass', fields = list(data='list'), methods = list( length=fun
length
,show
等。当这些方法被定义时,它们在类的方法中调用时会积极屏蔽类似的命名方法/函数。由于您不一定知道外部函数的名称空间,因此无法使用包::
说明符
有没有办法告诉一个方法忽略它自己的方法,除非使用.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
tC这个例子不是很清楚。我不知道为什么你不能知道你的方法的名称空间。不管怎样,这里有一些解决这个问题的方法:
您可以为引用类方法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)
)
)
您可以使用新的引用类系统李>
例如:
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)
)
)
tC6在我看来,您总是知道外部函数的名称空间。例如,您可以从帮助页面中看到它。在您的示例中,base::length(data)
足以使其工作。如果您知道输入是一个列表,则可以。但是想象一下这样一种情况:用户提供数据,即其中一个字段上没有调用length,因此您不知道传入了什么。您可以允许一个方法接受在不同包中定义的几个不同对象。为了使用::
您需要检查对象并进行手动分派-这是R通常会为您做的。@ThomasP85您的示例不清楚,最后的注释也不清楚。您正在使用类显式地设置数据的类型(这里出现的是一个列表),所以您怎么能不设置它的类型呢?