2

問題:

を拡張する参照クラスを作成したいと考えていますdata.table

動機は

  1. data.tableカスタムメソッドと可変フィールドが欲しい
  2. 既存のすべての構文 (インデックス作成、サブセット、マージなど) を期待どおりに動作させたい

問題は、私がこれまでに失敗したことです。

試み:

私は試した:

MyDataTable <- setRefClass("MyDataTable",
    methods = list(
        clearCell = function(i, j) {        # A trivial custom method - sets a cell to NA
            .self[i, (j) := NA]
        }
    ),
    contains = "data.table"
)

MyDataTable(a = 1:26, b = letters)$clearCell(1, 1)

しかし、エラーが発生しました:

Error in envRefSetField(.Object, field, classDef, selfEnv, elements[[field]]) : 
  ‘a’ is not a field in class “MyDataTable”

ただし、次のようなものを期待していました。

     a b
 1: NA a
 2:  2 b
 3:  3 c
 4:  4 d
 5:  5 e
 6:  ... etc etc 

何がうまくいかないのですか?

4

1 に答える 1

1

参照クラス オブジェクトを正しく初期化していません。どのように機能するのかわかりませんcontainsが、単純なフィールドが機能します:

MyDataTable <- setRefClass("MyDataTable",
                   fields  = list(.dt = 'data.table'),
                   methods = list(initialize = function(...){
                                    .self$.dt <- data.table(...)
                                  },
                                  clearCell  = function(i, j){
                                    .self$.dt[i, (j) := NA]
                                  },
                                  bracket    = function(...){
                                    .self$.dt[...]
                                  }
                                  ))

MyDataTable(a = 1:5, b = letters[1:5])$clearCell(1,1)
#    a b
#1: NA a
#2:  2 b
#3:  3 c
#4:  4 d
#5:  5 e

MyDataTable(a = 1:5, b = letters[1:5])$bracket(b == 'c', a := 10)
#    a b
#1:  1 a
#2:  2 b
#3: 10 c
#4:  4 d
#5:  5 e
于 2014-08-05T15:18:48.573 に答える