小编Seb*_*ian的帖子

如何在S4中使用data.table作为超类

在R-Package data.table中,?data.table-class表示'data.table' 的手册条目可用于类定义中的继承,即在调用中的contains参数中setClass:

library("data.table")
setClass("Data.Table", contains = "data.table")
Run Code Online (Sandbox Code Playgroud)

但是,如果我创建一个Data.Table的实例,我本可以预期我可以将其视为data.table.事实并非如此.以下片段会导致错误,据我所知,这是因为该[.data.table函数无法处理S3和S4调度的混合:

dat <- new("Data.Table", data.table(x = 1))
dat[TRUE]
Run Code Online (Sandbox Code Playgroud)

我通过定义一个新的方法[并将任何Data.Table强制转换为data.table然后在其中进行评估来解决这个问题.

setMethod(
  "[", 
  "Data.Table", 
  function(x, i, j, ..., drop = TRUE) {
    mc <- match.call()
    mc$x <- substitute(S3Part(x, strictS3 = TRUE))
    Data.Table(
      eval(mc, envir = parent.frame())
    )
  })
Run Code Online (Sandbox Code Playgroud)

一个构造函数让它感觉更舒服:

Data.Table <- function(...) new("Data.Table", data.table(...))
dat <- Data.Table(x = 1, key = "x")
dat[1]
Run Code Online (Sandbox Code Playgroud)

这对于某些场景是可以接受的,但是我放弃了data.table包中的所有get和set函数,我怀疑我销毁了其他一些功能.那么问题是如何实现一个有效的S4 data.table类?我将不胜感激

  1. 指向类似尝试/项目的指针
  2. 实施的更好/替代解决方案/想法
  3. 有关上述解决方案的性能方面的任何建议

对SO一个相关的问题,我发现,它提出了一个类似的方法.但是,我认为这将涉及太多编码以使其可行.

r s4 data.table

17
推荐指数
1
解决办法
723
查看次数

标签 统计

data.table ×1

r ×1

s4 ×1