My understanding is that all the really fast vectorized operations are implemented down in C code, not in R. Thus if you wanted to write a vectorized switch, which I agree would be rather nice to have, you'd need to do it down there and then write a .Call wrapper for it in R.
The ifelse (C) code would probably be a good place to start looking in terms of how to write it. Gabe On Fri, Dec 18, 2009 at 11:07 AM, Stavros Macrakis <macra...@alum.mit.edu>wrote: > What is the 'idiomatic' way of writing a vectorized switch statement? > > That is, I would like to write, e.g., > > vswitch( c('a','x','b','a'), > a= 1:4, > b=11:14, > 100 ) > => c(1, 100, 13, 4 ) > > equivalent to > > ifelse( c('a','x','b','a') == 'a', 1:4, > ifelse( c('a','x','b','a') == 'b', 11:14, > 100 ) ) > > A simple way of doing this is (leaving aside the default case): > > colchoose <- function(frame,selector) > mapply(function(a,b)frame[a,b],seq_along(frame[1]),selector)) > > colchoose( data.frame(a=1:4,b=11:14), c('a','b','b','a')) > => c(1,11,11,1) > > But of course this is not very efficient compared to the way ifelse works. > > Is there a standard function or idiom for this (am I missing something > obvious?), or should I write my own? > > -s > > [[alternative HTML version deleted]] > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > [[alternative HTML version deleted]] ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel