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 <[EMAIL PROTECTED]> Reply-To: [EMAIL PROTECTED] To: Martin Maechler <[EMAIL PROTECTED]> References: <[EMAIL PROTECTED]> <[EMAIL PROTECTED]>
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 <[EMAIL PROTECTED]> >>>>>> 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@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. ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel