On Fri, 20 Jan 2006, Peter Dalgaard wrote: [...]
> Yes, this is a bit nasty, but... What is happening is similar to this: > >> d <- data.frame(a=factor(LETTERS), b=factor(letters)) >> d[1,] > a b > 1 A a >> as.character(d[1,]) > [1] "1" "1" >> as.character(d[1,1]) > [1] "A" >> as.character(d[1,1,drop=F]) > [1] "1" > > or this: > >> l <- list(a=factor("x"),b=factor("y")) >> l > $a > [1] x > Levels: x > > $b > [1] y > Levels: y > >> as.character(l) > [1] "1" "1" > > The thing is that as.character on a list will first coerce factors to > numeric, then numeric to character. Nope. It just coerces an INTSXP to a STRSXP. as.character (and all other forms of coercion that I can think of quickly) ignores classes except when initially dispatching. Note that these examples are special cases: > as.character(d[1:2,]) [1] "c(1, 2)" "c(1, 2)" may also be unexpected but follows from the general (undocumented, I dare say) rules. > I'm not sure whether there could be a rationale for it, but it isn't > S-PLUS compatible (not 6.2.1 anyway, which is the most recent one that I > have access to). My S-PLUS deparses: > l <- list(a=factor("x"),b=factor("y")) > as.character(l) [1] "structure(.Data = 1, .Label = \"x\", class = \"factor\")" [2] "structure(.Data = 1, .Label = \"y\", class = \"factor\")" which seems no better (and probably worse). The only other consistent option I can see is for all coercion methods to dispatch at each element of a recursive object, which I suspect introduces a considerable overhead for very little gain. One could perhaps argue for a data.frame method, since coercion operations on dataframes are rare and that is a case where people get factors where they wanted character columns. -- Brian D. Ripley, [EMAIL PROTECTED] Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel