Dear list,
Reading the help page for ?switch didn't give me more than a hint at
what's going on here,
x = 5
y = 2
foo <- function(a="x"){
switch(a, "x" = x,
"y" = y)
}
foo(factor('x', levels=c('y', 'x')))
# 2
It seems that switch, when given a factor, uses the numeric codes
rather than the string levels as I would have naively expected. Is
this deliberate, should it be mentioned on the help page? I had an
input that had been invisibly converted to a factor by data.frame();
using switch resulted in serious confusion.
Thanks,
baptiste
Maybe I am misunderstanding you, but I think it is documented? The help
page says
switch(EXPR, ...)
[...]
If the value of ?EXPR? is not a character string it is coerced to
integer. [...]
Since
is.character( factor('x', levels=c('y', 'x')) )
[1] FALSE
you get
> as.integer( factor('x', levels=c('y', 'x')) )
[1] 2
from the "coerced to integer" part? Therefore the second statement
(y)
is evaluated regardless of the label ("y"=).
Allan
On 09/03/11 02:02, baptiste auguie wrote:> Dear list,
>
> Reading the help page for ?switch didn't give me more than a hint at
> what's going on here,
>
> x = 5
> y = 2
>
> foo<- function(a="x"){
> switch(a, "x" = x,
> "y" = y)
> }
>
> foo(factor('x', levels=c('y', 'x')))
>
> # 2
>
> It seems that switch, when given a factor, uses the numeric codes
> rather than the string levels as I would have naively expected. Is
> this deliberate, should it be mentioned on the help page? I had an
> input that had been invisibly converted to a factor by data.frame();
> using switch resulted in serious confusion.
>
> Thanks,
>
> baptiste
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
Dear Baptiste, On Tue, Mar 8, 2011 at 6:02 PM, baptiste auguie <baptiste.auguie at googlemail.com> wrote:> Dear list, > > Reading the help page for ?switch didn't give me more than a hint at > what's going on here, > > x = 5 > y = 2 > > foo <- function(a="x"){ > ? ? switch(a, "x" = x, > ? ? ? ? ? ? ? ? ? ? "y" = y) > } > > foo(factor('x', levels=c('y', 'x'))) > > # 2 > > It seems that switch, when given a factor, uses the numeric codes > rather than the string levels as I would have naively expected. Is > this deliberate, should it be mentioned on the help page? I had anThis strikes me as similar to a discussion awhile back about whether factors should behave primarily as their string levels or underlying numeric representation:> dput(factor('x', levels = c('y', 'x')))structure(2L, .Label = c("y", "x"), class = "factor") which of course also depends on whether methods are explicitly defined:> dat <- factor('x', levels=c('y', 'x')) > as.vector(dat) ## has methods[1] "x"> c(dat) ## does not[1] 2 Because factors sort of live between worlds, "expecting" may be a bit of a risky thing. Cheers, Josh> input that had been invisibly converted to a factor by data.frame(); > using switch resulted in serious confusion. > > Thanks, > > baptiste > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.-- Joshua Wiley Ph.D. Student, Health Psychology University of California, Los Angeles http://www.joshuawiley.com/