在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类?我将不胜感激
有对SO一个相关的问题,我发现,它提出了一个类似的方法.但是,我认为这将涉及太多编码以使其可行.