3

回避したいR参照クラスの動作に遭遇しました。次のコードでは、参照クラス B に参照クラス A の 2 つのフィールドがあります。

B のこれらのフィールドは、B のinitialize()メソッドが呼び出される前に、参照クラス A のゼロ引数 (デフォルト) バージョンで (おそらく 2 回) インスタンス化されているように見えます。これらのインスタンスは、B の初期化プロセス中にインスタンス A の正しいバージョンに置き換えられます。問題は、lock()B のインスタンス ジェネレーターから使用する場合、A の最初の空のインスタンス化を B で置き換えることができないことです。別の問題は、参照クラス A が初期化 [または Missing(c) テスト] で既定値を必要とすることです。

ヘルプ - 提案 - など。

A <- setRefClass('A',
    fields = list(
        count = 'numeric'
    ),

    methods = list(
        initialize = function (c=0) {
            cat('DEBUG: A$initialize(c); where c=');  cat(c); cat('\n')
            count <<- c
        }
    )
)

instance.of.A <- A$new(10)
str(instance.of.A)

B <- setRefClass('B',
    field = list(
        a = 'A',
        b = 'A'
    ),

    methods = list(
        initialize = function(c) {
            a <<- instance.of.A
            b <<- getRefClass('A')$new(c)
        }
    )
)

instance.of.b <- B$new(100)
str(instance.of.b)
4

2 に答える 2

2

考えられる解決策は次の 2 つです。

  1. fields 属性を設定しないでください:

    B <- setRefClass('B',
        methods = list(
            initialize = function(c) {
              .self$a = instance.of.A
              .self$b =getRefClass('A')$new(c)
            }
         )
     )
    
  2. フィールドを設定しますが、ANYクラスを使用します:

    B <- setRefClass('B',
        field = (a="ANY", b="ANY"), 
        methods = list(
            initialize = function(c) {
              a <<- instance.of.A
              b <<- getRefClass('A')$new(c)
            }
         )
     )
    

これらの両方のソリューションの欠点は、タイプがaandbで強制されないことです。つまり

 B$a = "Fred"

が可能になりました。

于 2012-11-08T21:04:38.403 に答える
0

上記を参考にして、私が使用している解決策は次のとおりです(型チェックのために少し長いです):

A <- setRefClass('A',
    fields = list(
        count = function(x) {
            if (!missing(x)) {
                if(class(x) != 'numeric')
                    stop('Class A: count set by non-number')
                .self$count.private <- x
            }
            .self$count.private
        }
    ),

    methods = list(
        initialize = function (c=0) {
            cat('DEBUG: A$initialize(c); where c=');  cat(c); cat('\n')
            count <<- c
        }
    )
)

instance.of.A <- A$new(10)
str(instance.of.A)

B <- setRefClass('B',
    field = list(
        a = function(x) {
            if (!missing(x)) {
                if(!inherits(x, 'envRefClass') || class(x)[1] != 'A')
                    stop('Class B: expecting instance of class A')
                .self$a.private <- x
            }
            .self$a.private
        },
        b = function(x) {
            if (!missing(x)) {
                if(!inherits(x, 'envRefClass') || class(x)[1] != 'A')
                    stop('Class B: expecting instance of class A')
                .self$b.private <- x
            }
            .self$b.private
        }
    ),

    methods = list(
        initialize = function(c) {
            a <<- instance.of.A
            b <<- getRefClass('A')$new(c)
        }
    )
)

instance.of.b <- B$new(100)
str(instance.of.b)
于 2012-11-08T22:52:09.610 に答える