Re: [Rd] How to put my S4 class into data.frame

From: Martin Maechler <maechler_at_stat.math.ethz.ch>
Date: Sat 04 Nov 2006 - 09:42:37 GMT

>>>>> "Gregor" == Gregor Gorjanc <gregor.gorjanc@bfro.uni-lj.si> >>>>> on Sat, 04 Nov 2006 02:09:13 +0100 writes:

    Gregor> Ferdinand Alimadhi wrote:

      >> tmp$comp <- x@ratios ?!

    Gregor> I "lose" class here and that is not what I
    Gregor> want. Perhaps I should stick with list instead of
    Gregor> data.frame.

Yes, I probably would, at least for the time being.

OTOH, it's interesting that some methods to "stick some S4 objects into a data frame do work fine , at least for the following case (R-script below) -- and I wonder if we (R developers) shouldn't think about more explicitly supporting this, e.g., by stating something like

>> If an S4 object simply *contains* an atomic class that can be
>> used as data.frame column, then that S4 object can also be used
>> as data.frame column

and trying to fix all cases where the above is not fulfilled.

  setClass("Real", contains="numeric")
  (r <- new("Real", pi * 1:3))
  try( dd <- data.frame(x = 1:3, R = r) ) ## fails   ## Error in as.data.frame.default(x[[i]], optional = TRUE) :   ## cannot coerce class "Real" into a data.frame

  dd <- data.frame(x = 1:3)
  dd[,"R"] <- r ## works fine .. didn't I say just yesterday how much

                ## I recommend [, <name>] indexing for data frames ?   dd
  str(dd)
  dd[1:2,]
  ## but
  str(dd[1:2,]) # has lost the class -- of course since r[1:2] loses it   ## -> you need to define a correct subset method for your class   ## e.g.,
  setMethod("[", signature(x = "Real", i = "ANY"),

            function(x, i,j,drop, ...) new("Real", callNextMethod()))

  r[1:2] # now correct
  str(dd[1:2,]) # correct too

Martin Maechler, ETH Zurich

    >> Gregor Gorjanc wrote:
    >> 
    >>> Hello!
    >>> 
    >>> I am developing a composition class, which represents a
    >>> composition of mixture of levels, say soil has three
    >>> components and each component accounts for 1/3 of the
    >>> unit. I have tried with S4 class system and I would
    >>> appreciate any help here. I was hoping that I would be
    >>> able to include instance of my class into a
    >>> data.frame. However, I encounter problems.
    >>> 
    >>> Simple definition of class could be
    >>> 
    >>> setClass(Class="composition",
    >>> representation=representation(ratios="matrix"))
    >>> 
    >>> n <- 2 k <- 3
    >>> 
    >>> x <- new(Class="composition",
    >>> ratios=matrix(data=rep(x=1/3, times=n*k), nrow=n,
    >>> ncol=k))
    >>> 
    >>> x An object of class "composition" Slot "ratios": [,1]
    >>> [,2] [,3] [1,] 0.3333333 0.3333333 0.3333333 [2,]
    >>> 0.3333333 0.3333333 0.3333333
    >>> 
    >>> tmp <- data.frame(id=1:2) tmp$comp <- x Error: object is
    >>> not subsettable
    >>> 
    >>> As I understand this, my problem is that x is of length
    >>> 1 as the following works
    >>> 
    >>> tmp$comp <- c(x, x)
    >>> 
    >>> although I am not able to print tmp now
    >>> 
    >>> tmp Error in unlist(x, recursive, use.names) : argument
    >>> not a list
    >>> 
    >>> but this is expected as I (probably) need show/print
    >>> method for this.  How can I put my class into data.frame
    >>> or how can I make my class behave as a vector?
    >>> 
    >>> Thanks!

    Gregor> -- Lep pozdrav / With regards, Gregor Gorjanc
    Gregor> ----------------------------------------------------------------------
    Gregor> University of Ljubljana PhD student Biotechnical
    Gregor> Faculty Zootechnical Department URI:
    Gregor> http://www.bfro.uni-lj.si/MR/ggorjan Groblje 3 mail:     Gregor> gregor.gorjanc <at> bfro.uni-lj.si

    Gregor> SI-1230 Domzale tel: +386 (0)1 72 17 861 Slovenia,     Gregor> Europe fax: +386 (0)1 72 17 888



R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Sun Nov 05 01:49:49 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Sat 04 Nov 2006 - 16:30:33 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.