问题:
我希望创建一个引用类来扩展data.table
。
的动机
- 想要一个具有自定义方法和可变字段的
data.table
- 仍然希望所有现有语法(如索引、子集、合并等(都能按预期工作
问题是到目前为止我还没有成功。
尝试次数:
我试过了:
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
怎么了?
您没有正确初始化引用类对象。我不知道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