R,R6,从 R6Generator 对象获取完整的类名

标签 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())

否则会返回什么

在现实世界中,我有一组复杂的继承,并且有很多参数的初始化器,有些没有默认值,所以我试图避免实例化一个新对象来获取这些信息。

最佳答案

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

您可以执行类似这样的操作来查找继承链,但这使用了一些将来可能会更改的内部 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"  

关于R,R6,从 R6Generator 对象获取完整的类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37303552/

相关文章:

java - 使用抽象类的类名在 Java 中创建一个新对象?

c++ - 有没有办法从保存类名的字符串中实例化对象?

c++ - 在 C++ 中作为参数传递时,数组隐式转换为容器类

r - R 词干中的 SnowballC "many"和 "only"

r - 在scale_*_manual中使用palette参数

r - 如何合并 R 中同一数据框中的行(基于特定列下的重复值)?

c++ - 将成对 vector 与用户定义的类对象一起使用

R:如何取每n行的min和max或其他函数

javascript - 具有 Set 集合的类方法不返回任何内容

c++ - 将函数标记为虚拟会导致 unique_ptr 出现编译器错误