В таблице данных R-пакета в ручном вводе для ?data.table-class
указано, что "data.table" может использоваться для наследования в определении класса, то есть в аргументе contains в вызове setClass
:
library("data.table")
setClass("Data.Table", contains = "data.table")
Однако, если я создам экземпляр Data.Table, я бы ожидал, что я могу рассматривать его как таблицу данных. Это не так. Следующий фрагмент приведет к ошибке, которая, насколько я понимаю, связана с тем, что функция [.data.table
не может обрабатывать соединение отправки S3 и S4:
dat <- new("Data.Table", data.table(x = 1))
dat[TRUE]
Я решил это, определив новый метод для [
и принудительно применив любой 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())
)
})
И конструктор, чтобы чувствовать себя более комфортно с ним:
Data.Table <- function(...) new("Data.Table", data.table(...))
dat <- Data.Table(x = 1, key = "x")
dat[1]
Это приемлемо для некоторых сценариев, но я теряю все функции get и set из пакета data.table, и я подозреваю, что я уничтожил некоторые другие функции. Итак, вопрос в том, как реализовать рабочий класс S4 data.table? Я был бы признателен
- Указатели на аналогичные попытки/проекты
- Лучшие/альтернативные решения/идеи для реализации
- Любые советы по поводу того, что я теряю в отношении производительности с вышеупомянутым решением.
Существует один связанный вопрос на SO. Я нашел, что представляет собой аналогичный подход. Однако, я думаю, что это потребует слишком много кодирования, чтобы быть выполнимым.