From gregor.gorjanc at gmail.com  Wed Mar 22 08:50:02 2006
From: gregor.gorjanc at gmail.com (Gregor Gorjanc)
Date: Wed, 22 Mar 2006 08:50:02 +0100
Subject: [Rd] [Fwd: Re:  levels for list and data.frame]
Message-ID: <442101AA.2080507@gmail.com>

I unintentionally missed to cc to r-devel.

-------- Original Message --------
Subject: Re: [Rd] levels for list and data.frame
Date: Tue, 21 Mar 2006 20:50:21 +0100
From: Gregor Gorjanc <gregor.gorjanc at gmail.com>
Reply-To: gregor.gorjanc at gmail.com
To: Martin Maechler <maechler at stat.math.ethz.ch>
References: <441F2C49.8080703 at gmail.com>
<17439.50351.172900.987055 at stat.math.ethz.ch>

Martin Maechler wrote:
> Hi Gregor,
> 
> before even considering methods for "list" and "data.frame",
> can you explain why you think it is important for  levels() to
> become a generic function at all?
> For me, levels belong to factors (or then to contour plots, or
> co-plots ) but exactly because level is a too generic word, it
> seems to me to be problematic as a generic function.
> 
> How would describe the purpose of the levels() generic?
> 

You are right. I was in situation where I wanted to get levels from all
entries (factors) of a list and considered to write a method for this
instead of always using lapply(). It went quite smoothly, if I skip R
CMD check error. After that I began to think and post a question to
R-devel. Perhaps levels is really to generic, however one can set levels
also for non-factors. Although, I agree that this is of no use. I was
also playing with levels<- and find it quite hard to do something
general and usable for lists and data.frame.

If we put levels aside, is there any opinion/policy about list,
data.frame methods? Just curiosity.

> 
>>>>>>"Gregor" == Gregor Gorjanc <gregor.gorjanc at gmail.com>
>>>>>>    on Mon, 20 Mar 2006 23:27:21 +0100 writes:
> 
> 
>     Gregor> oops, this does not pass R CMD check. I will have to read manuals a bit
>     Gregor> more.
> 
>     Gregor> ...
>     Gregor> * checking S3 generic/method consistency ... WARNING
>     Gregor> levels:
>     Gregor> function(x, ...)
>     Gregor> levels.list:
>     Gregor> function(x, drop)
> 
>     Gregor> levels:
>     Gregor> function(x, ...)
>     Gregor> levels.data.frame:
>     Gregor> function(x, drop)
>     Gregor> ...
> 
>     Gregor> Anyway, I would like to ask what is the "opinion" about writing methods
>     Gregor> for classes as list and data.frame. Methods for this might not be as
>     Gregor> simple as for numeric, character, factor and it would be nice that there
>     Gregor> would be some guidelines for at least:
>     Gregor> - what should be the "general" output i.e. list or something else - I
>     Gregor> understand that it is hard to say in advance, but a common policy might
>     Gregor> not hurt
>     Gregor> - what to do if a method for a list or data.frame can not be applied to
>     Gregor> each entry/column
> 
> 
>     >> Hello!
>     >> 
>     >> Does R core find the following pacth usefull - I created methods for
>     >> levels for list and data.frame, which can be usefull to get a list of
>     >> levels for entries in a list or columns in a data.frame. Patch is
>     >> attached and shown bellow example
>     >> 
>     >> # Example
>     >>> tmp <- list()
>     >>> tmp$a <- factor(letters[1:10])
>     >>> tmp$b <- factor(letters[5:14])
>     >>> tmp$c <- 1:10
>     >>> tmp1 <- as.data.frame(tmp)
>     >>> tmp2 <- list()
>     >>> tmp2$"1" <- tmp
>     >>> tmp2$"2" <- tmp1
>     >>> str(tmp2)
>     >> List of 2
>     >> $ 1:List of 3
>     >> ..$ a: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10
>     >> ..$ b: Factor w/ 10 levels "e","f","g","h",..: 1 2 3 4 5 6 7 8 9 10
>     >> ..$ c: int [1:10] 1 2 3 4 5 6 7 8 9 10
>     >> $ 2:`data.frame':      10 obs. of  3 variables:
>     >> ..$ a: Factor w/ 10 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10
>     >> ..$ b: Factor w/ 10 levels "e","f","g","h",..: 1 2 3 4 5 6 7 8 9 10
>     >> ..$ c: int [1:10] 1 2 3 4 5 6 7 8 9 10
>     >> 
>     >>> levels(tmp2)
>     >> $"1"
>     >> $"1"$a
>     >> [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
>     >> 
>     >> $"1"$b
>     >> [1] "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
>     >> 
>     >> 
>     >> $"2"
>     >> $"2"$a
>     >> [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
>     >> 
>     >> $"2"$b
>     >> [1] "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
>     >> 
>     >>> levels(tmp2, drop = FALSE)
>     >> $"1"
>     >> $"1"$a
>     >> [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
>     >> 
>     >> $"1"$b
>     >> [1] "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
>     >> 
>     >> $"1"$c
>     >> NULL
>     >> 
>     >> 
>     >> $"2"
>     >> $"2"$a
>     >> [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
>     >> 
>     >> $"2"$b
>     >> [1] "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
>     >> 
>     >> $"2"$c
>     >> NULL
>     >> 
>     >> ----------------------------------------------------------------------
>     >> 
>     >> $ svn diff factor.R
>     >> Index: factor.R
>     >> ===================================================================
>     >> --- factor.R    (revision 37559)
>     >> +++ factor.R    (working copy)
>     >> @@ -25,7 +25,25 @@
>     >> ## Help old S users:
>     >> category <- function(...) .Defunct()
>     >> 
>     >> -levels <- function(x) attr(x, "levels")
>     >> +levels <- function(x, ...) UseMethod("levels")
>     >> +
>     >> +levels.default <- function(x, ...) attr(x, "levels")
>     >> +
>     >> +levels.list <- function(x, drop = TRUE)
>     >> +{
>     >> +    tmp <- lapply(x, levels, drop = drop)
>     >> +    if (drop) {
>     >> +        tmp1 <- unlist(lapply(tmp, is.null))
>     >> +        tmp <- tmp[!tmp1]
>     >> +    }
>     >> +    return(tmp)
>     >> +}
>     >> +
>     >> +levels.data.frame <- function(x, ...)
>     >> +{
>     >> +    return(levels.list(x, ...))
>     >> +}
>     >> +
>     >> nlevels <- function(x) length(levels(x))
>     >> 
>     >> "levels<-" <- function(x, value) UseMethod("levels<-")
>     >> 
> 
>     Gregor> -- 
>     Gregor> Lep pozdrav / With regards,
>     Gregor> Gregor Gorjanc
> 
>     Gregor> ----------------------------------------------------------------------
>     Gregor> University of Ljubljana     PhD student
>     Gregor> Biotechnical Faculty
>     Gregor> Zootechnical Department     URI: http://www.bfro.uni-lj.si/MR/ggorjan
>     Gregor> Groblje 3                   mail: gregor.gorjanc <at> bfro.uni-lj.si
> 
>     Gregor> SI-1230 Domzale             tel: +386 (0)1 72 17 861
>     Gregor> Slovenia, Europe            fax: +386 (0)1 72 17 888
> 
>     Gregor> ----------------------------------------------------------------------
>     Gregor> "One must learn by doing the thing; for though you think you know it,
>     Gregor> you have no certainty until you try." Sophocles ~ 450 B.C.
> 
>     Gregor> ______________________________________________
>     Gregor> R-devel at r-project.org mailing list
>     Gregor> https://stat.ethz.ch/mailman/listinfo/r-devel
> 


-- 
Lep pozdrav / With regards,
    Gregor Gorjanc

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

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

----------------------------------------------------------------------
"One must learn by doing the thing; for though you think you know it,
 you have no certainty until you try." Sophocles ~ 450 B.C.
----------------------------------------------------------------------


-- 
Lep pozdrav / With regards,
    Gregor Gorjanc

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

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

----------------------------------------------------------------------
"One must learn by doing the thing; for though you think you know it,
 you have no certainty until you try." Sophocles ~ 450 B.C.



[Rd] [Fwd: Re: levels for list and data.frame]
Gregor Gorjanc