Ronny Wölbing
2008-Nov-20 10:32 UTC
[R] How to convert S4 class slots into data.frame or how to assign variables of type 'Date'
Hi, I created a class (S4) with some slots like value, date, description (it's actually a financial transaction class). Now I need a method to convert this class forth and back into a single row data.frame, where every slots represents a column. This method looks at the moment like this: > setMethod("as.data.frame", "Transaction", function(x, row.names = NULL, optional = FALSE, ...){ slotnames <- slotNames(x) slotlist <- data.frame(rbind(1:length(slotnames))) names(slotlist) <- slotnames for(i in slotnames) { slotlist[1, i] <- slot(x, i) } return(slotlist) } ) This method doesn't require predetermined slotnames or types, which is important to me. The method works quite good but the problem is that I have slots of type 'Date' and this method doesn't preserve the type but converts it to numeric. A couple of tests showed that this is actually a problem of assigning values to data.frame column. Something like this: > slotlist$DayOfTransaction <- slot(Transaction, DateOfTransaction) would preserve the type of DateOfTransaction as 'Date'. But I don't see a way to use this assigning scheme in my method without using the actual slotnames and giving up a lot of flexibility. Do you have any suggestions? Is there maybe even a simple way to convert S4 slots into data.frames? Thanks in advance Ronny
Ronny Wölbing
2008-Nov-21 20:10 UTC
[R] How to convert S4 class slots into data.frame or how to assign variables of type 'Date'
> Hi, > > I created a class (S4) with some slots like value, date, description > (it's actually a financial transaction class). Now I need a method > to convert this class forth and back into a single row data.frame, > where every slots represents a column. This method looks at the > moment like this: > > > setMethod("as.data.frame", "Transaction", > function(x, row.names = NULL, optional = FALSE, ...){ > slotnames <- slotNames(x) > slotlist <- > data.frame(rbind(1:length(slotnames))) > names(slotlist) <- slotnames > for(i in slotnames) { > slotlist[1, i] <- slot(x, i) > } > return(slotlist) > } > ) > > This method doesn't require predetermined slotnames or types, which > is important to me. The method works quite good but the problem is > that I have slots of type 'Date' and this method doesn't preserve > the type but converts it to numeric. > > A couple of tests showed that this is actually a problem of > assigning values to data.frame column. Something like this: > > > slotlist$DayOfTransaction <- slot(Transaction, DateOfTransaction) > > would preserve the type of DateOfTransaction as 'Date'. > > But I don't see a way to use this assigning scheme in my method > without using the actual slotnames and giving up a lot of flexibility. > > Do you have any suggestions? Is there maybe even a simple way to > convert S4 slots into data.frames? > > Thanks in advance > Ronny > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.Does nobody has an idea?