I want to create a data.frame of different variables, including S4 classes. For a built-in class like "POSIXlt" (for dates) this works fine:
as.data.frame(list(id=c(1,2),
date=c(as.POSIXlt('2013-01-01'),as.POSIXlt('2013-01-02'))
But now i have a user defined class, let's say a "Person" class with name and age:
setClass("person", representation(name="character", age="numeric"))
But the following fails:
as.data.frame(list(id=c(1,2), pers=c(new("person", name="John", age=20),
new("person", name="Tom", age=30))))
I also tried to overload the [...]-Operator for the person class using
setMethod(
f = "[",
signature="person",
definition=function(x,i,j,...,drop=TRUE){
initialize(x, name=x@name[i], age = x@age[i])
}
)
This allows for vector-like behavior:
persons = new("person", name=c("John","Tom"), age=c(20,30))
p1 = persons[1]
But still the following fails:
as.data.frame(list(id=c(1,2), pers=persons))
Perhaps I have to overload more operators to get the user defined class into a dataframe? I am sure, there must be a way to do this, as POSIXlt is an S4 class and it works! Any solution using the new R5 reference classes would be also fine!
I do not want to put all my data into the person class (You could ask, why "id" is not a member of person I just do not use dataframes)! The idea is that my data.frame represents a table from a database with many columns with different types, e.g., strings, numbers,... but also dates, intervals, geo-objects, etc... While for dates I already have a solution (POSIXlt), for intervals, geo-objects, etc. I probably need to specify my own S4/R5 classes.
Thanks a lot in advance.