在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())
在现实世界中,我有一组复杂的继承,以及带有许多参数的初始化程序,有些没有默认值,所以我试图避免实例化一个新对象以获取此信息。
答案 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"