From tlumley at u.washington.edu  Fri Dec 18 20:49:30 2009
From: tlumley at u.washington.edu (tlumley at u.washington.edu)
Date: Fri, 18 Dec 2009 11:49:30 -0800 (PST)
Subject: [Rd] Vectorized switch
In-Reply-To: <c797fbfb0912181134o621f6501t62e2dba5b813cbf1@mail.gmail.com>
Message-ID: <alpine.LRH.2.01.0912181149300.16373@hymn13.u.washington.edu>

On Fri, 18 Dec 2009, Gabriel Becker wrote:

> 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: ifelse() is not in C, nor is it really fast (though it is better than it used to be).

Stavros: I don't think there is a standard idiom.  I tend to use match() to work out which choice applies for each element, or nested ifelse if there are only three choices.

       -thomas

> 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
>

Thomas Lumley			Assoc. Professor, Biostatistics
tlumley at u.washington.edu	University of Washington, Seattle



[Rd] Vectorized switch
tlumley at u.washington.edu