8

私は数十のフィールドを持つ参照クラスを使用しています。リストオブジェクトを取り込むメソッドを設定しましたinitialize()。一部のフィールドはリスト要素からのさらなる計算に依存していますが、ほとんどのフィールドはリスト要素から直接割り当てられます。

fieldA <<- list$A
fieldB <<- list$B

これを少し自動化したほうがいいと思っていました。R擬似コードで例を示すには(この例は明らかに機能しません):

for (field in c('A', 'B', 'C', 'D'))
   field <<- list[[field]]

<<-たとえば、次のようなことを行って、いくつかのエンドランを実行してみました。

for field in c('A', 'B', 'C', 'D'))
  do.call('<<-' c(field, list[[field]])) 

しかし、サイコロはありません。

私の推測では、この種の動作は現在の参照クラスの化身では単純に不可能ですが、SOランドの誰かがこれを行うためのより良い方法を知っているかどうかを確認する価値があると思いました。

4

1 に答える 1

7

を使用.selfしてインスタンスを示し、 を使用してフィールドを選択します[[。私は 100% 確実ではありません (しかし、誰が?) それ[[が厳密に合法です。にデフォルトを追加したlstので、 として呼び出されたときに機能しC$new()ます。これは、参照クラスと同様の方法で噛む可能性が高いと思われる S4 の暗黙の仮定です。

C <- setRefClass("C",
    fields=list(a="numeric", b="numeric", c="character"),
    methods=list(
      initialize=function(..., lst=list(a=numeric(), b=numeric(), c=character()) 
        {
          directflds <- c("a", "b")
          for (elt in directflds)
              .self[[elt]] <- lst[[elt]]
          .self$c <- as.character(lst[["c"]])
          .self
      }))
c <- C$new(lst=list(a=1, b=2, c=3))

または、リストまたは要素自体をユーザーに渡すオプションを残します

B <- setRefClass("B",
    fields=list(a="numeric", b="numeric", c="character"),
    methods=list(
      initialize=function(..., c=character()) {
          callSuper(...)
          .self$c <- as.character(c)
          .self
      }))
b0 <- B$new(a=1, b=2, c=3)
b1 <- do.call(B$new, list(a=1, b=2, c=3))

これはまた、への呼び出しからいくつかの値を省略することに対してより寛容であるようnew()です。

于 2011-04-14T00:37:47.257 に答える