Re: [Rd] Vectorized switch

From: Gabriel Becker <gmbecker_at_ucdavis.edu>
Date: Fri, 18 Dec 2009 11:34:06 -0800

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 <macrakis_at_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_at_r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>

        [[alternative HTML version deleted]]



R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Fri 18 Dec 2009 - 19:39:17 GMT

This archive was generated by hypermail 2.2.0 : Fri 18 Dec 2009 - 20:51:10 GMT