Вот ваш класс, с интерпретацией «колонки» его определения, а не с строкой; это будет важно для производительности; также дате ссылки
setClass("person", representation(name="character", age="numeric"))
pers <- new("person", name=c("John", "Tom"), age=c(20, 30))
date <- as.POSIXct(c('2013-01-01', '2013-01-02'))
Некоторые эксперименты, включая просмотр methods(class="POSIXct")
и обратное внимание к сообщениям об ошибках, привели меня к реализации as.data.frame.person
и format.person
(последний используется для отображения в данных .frame) как
as.data.frame.person <-
function(x, row.names=NULL, optional=FALSE, ...)
{
if (is.null(row.names))
row.names <- x@name
value <- list(x)
attr(value, "row.names") <- row.names
class(value) <- "data.frame"
value
}
format.person <- function(x, ...) paste0(x@name, ", ", x@age)
Это получает мои объекты в файле data.frame:
> lst <- list(id=1:2, date=date, pers=pers)
> as.data.frame(lst)
id date pers
John 1 2013-01-01 John, 20
Tom 2 2013-01-02 Tom, 30
Если я хочу подмножество, тогда мне нужно
setMethod("[", "person", function(x, i, j, ..., drop=TRUE) {
initialize(x, name=x@name[i], age=x@age[i])
})
Я не уверен, какие другие методы могут потребоваться по мере того, как встречаются больше операций data.frame
, нет «интерфейса data.frame».
Использование векторизованного класса в data.table кажется для использования метода длины для построения.
> library(data.table)
> data.table(id=1:2, pers=pers)
Error in data.table(id = 1:2, pers = pers) :
problem recycling column 2, try a simpler type
> setMethod(length, "person", function(x) length(x@name))
[1] "length"
> data.table(id=1:2, pers=pers)
id pers
1: 1 John, 20
2: 2 Tom, 30
Возможно, есть интерфейс data.table?