title: How to create a dataframe of user defined S4 classes in R
body: <p>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:</p>
  
  <pre><code>as.data.frame(list(id=c(1,2), 
                     date=c(as.POSIXlt('2013-01-01'),as.POSIXlt('2013-01-02'))
  </code></pre>
  
  <p>But now i have a user defined class, let's say a "Person" class with name and age:</p>
  
  <pre><code>setClass("person", representation(name="character", age="numeric"))
  </code></pre>
  
  <p>But the following fails:</p>
  
  <pre><code>as.data.frame(list(id=c(1,2), pers=c(new("person", name="John", age=20),
                                       new("person", name="Tom", age=30))))
  </code></pre>
  
  <p>I also tried to overload the [...]-Operator for the person class using</p>
  
  <pre><code>setMethod(
    f = "[",
    signature="person",
    definition=function(x,i,j,...,drop=TRUE){ 
      initialize(x, name=x@name[i], age = x@age[i])
    }
  )
  </code></pre>
  
  <p>This allows for vector-like behavior:</p>
  
  <pre><code>persons = new("person", name=c("John","Tom"), age=c(20,30))
  p1 = persons[1]
  </code></pre>
  
  <p>But still the following fails:</p>
  
  <pre><code>as.data.frame(list(id=c(1,2), pers=persons))
  </code></pre>
  
  <p>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!</p>
  
  <p>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.</p>
  
  <p>Thanks a lot in advance.</p>