0

1つのフィールドに値を割り当てると、他のフィールドを変更するにはどうすればよいですか。

ReferenceClass次のオブジェクトについて考えてみます。

C<-setRefClass("C", 
      fields=list(a="numeric",b="numeric")
      , methods=list(
      seta = function(x){
      a<<-x
      b<<-x+10
      cat("The change took place!")
      }
      ) # end of the methods list
      ) # end of the class

次に、クラスのインスタンスを作成します

c<-C$new() 

このコマンド

c$seta(10)

その結果、c $ aは10、c$bは20になります。

だから実際には動作しますが、コマンドでこの結果を達成したい

c$a<-10

(つまり、その後、seta()関数のロジックのクラスで定義されているようにc $ bを20に等しくしたい)
どうすればよいですか?

4

1 に答える 1

3

で詳しく説明されているアクセサ関数を探していると思います?ReferenceClasses。これは機能するはずです:

C<-setRefClass("C", 
    fields=list(
        a=function(v) {
              if (missing(v)) return(x)
              assign('x',v,.self)                    
              b<<-v+10
              cat ('The change took place!')
            }
       ,b="numeric"
    )
    ,methods=list(
        initialize=function(...)  {
             assign('x',numeric(),.self)
            .self$initFields(...)
        } 
    )
)

c<-C$new()
c$a
# numeric(0)
c$a<-3
# The change took place!
c$b
# 13
c$a
# 3

x新しい値が環境(クラスオブジェクト)に存在するという副作用はありますが、印刷するだけではフィールドとしてリストされないcという意味で、ユーザーには「非表示」になっています。cx

于 2012-07-09T19:06:16.813 に答える