R,R6,从R6Generator对象获取全类名

时间:2016-05-18 15:06:47

标签: r class instantiation r6

在R6中,如何在不创建生成器对象实例的情况下获取类继承的完整列表?

请考虑以下事项:

A = R6::R6Class("Base",NULL)
B = R6::R6Class("Top",inherit = A)
class(B)     #Returns 'R6ClassGenerator'
B$classname  #Returns 'Top' 

我想要的是c('Top','Base','R6')

换句话说,class(B$new())

会返回什么

在现实世界中,我有一组复杂的继承,以及带有许多参数的初始化程序,有些没有默认值,所以我试图避免实例化一个新对象以获取此信息。

1 个答案:

答案 0 :(得分:5)

没有内置的方法来查找B继承的所有类而不调用B$new()。这是因为继承是在实例化对象时确定的,而不是在创建类时确定的。类(AKA生成器对象)知道它继承的类的名称,但只有在实例化对象时才会评估该名称。

你可以做这样的事情来找到继承链,但这会使用一些可能在将来发生变化的内部API(虽然它们可能会赢得):

findClasses <- function(x) {
  if (is.null(x))
    return(NULL)
  parent <- x$get_inherit()
  c(x$classname, findClasses(parent))
}

A <- R6::R6Class("Base",NULL)
B <- R6::R6Class("Middle", inherit = A)
C <- R6::R6Class("Top", inherit = B)
findClasses(C)
#> [1] "Top"    "Middle" "Base"