【问题标题】:How to extend a data.table using Reference Classes?如何使用引用类扩展 data.table?
【发布时间】:2014-08-05 11:25:55
【问题描述】:

问题:

我希望创建一个扩展 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 

怎么了?

【问题讨论】:

  • 我很好奇动机 - 请举一个问题示例?
  • @eddi - 很多例子说明了为什么人们可能想要扩展data.table 的功能。例如,考虑一个data.table,它是一个数据库表的抽象。也就是说,我可以简单地通过MyTable[id == 4, field := "a"] 写入数据库表,并且 还可以更新我的 R 会话中的内存表。为此,这种扩展的data.table 需要跟踪其他变量,例如(数据库连接、它所链接的数据库表的名称等),这些变量最好存储为引用类字段。

标签: r data.table reference-class


【解决方案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

【讨论】:

  • 谢谢@eddi,但我的第二个问题是:still want all existing syntax (such as indexing, subset, merge etc) to work as expected。但是,通过您的设置,使用像 MyDataTable(a = 1:5)[, a := a + 1] 这样的常用索引会失败。
  • 我很确定你不能那样做。您可以添加一个不同的函数来调用[.data.table - 请参阅编辑。
猜你喜欢
  • 2021-06-20
  • 1970-01-01
  • 2021-07-24
  • 2017-12-02
  • 2013-06-25
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 2020-05-31
相关资源
最近更新 更多