From gregor.gorjanc at gmail.com  Mon Mar 20 23:27:21 2006
From: gregor.gorjanc at gmail.com (Gregor Gorjanc)
Date: Mon, 20 Mar 2006 23:27:21 +0100
Subject: [Rd] levels for list and data.frame
Message-ID: <441F2C49.8080703@gmail.com>

oops, this does not pass R CMD check. I will have to read manuals a bit
more.

...
* checking S3 generic/method consistency ... WARNING
levels:
  function(x, ...)
levels.list:
  function(x, drop)

levels:
  function(x, ...)
levels.data.frame:
  function(x, drop)
...

Anyway, I would like to ask what is the "opinion" about writing methods
for classes as list and data.frame. Methods for this might not be as
simple as for numeric, character, factor and it would be nice that there
would be some guidelines for at least:
- what should be the "general" output i.e. list or something else - I
understand that it is hard to say in advance, but a common policy might
not hurt
- what to do if a method for a list or data.frame can not be applied to
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<-")
> 

-- 
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] levels for list and data.frame
Gregor Gorjanc