2

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

現実の世界では、複雑な一連の継承があり、多くの引数を持つ初期化子があり、一部にはデフォルト値がないため、この情報を取得するために新しいオブジェクトをインスタンス化することを避けようとしています。

4

1 に答える 1

6

を呼び出さずに 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"  
于 2016-05-18T20:31:56.547 に答える