[R] Vectorizing a function: what does it mean?

Duncan Murdoch murdoch.duncan at gmail.com
Mon May 9 20:32:05 CEST 2011


On 09/05/2011 1:31 PM, David Winsemius wrote:
> On May 9, 2011, at 11:57 AM, Ron Michael wrote:
>
> >  Dear all, I would really appreciate if somebody can help me to
> >  understand what does the phrase "Vectorize your function" mean? And
> >  what is the job of Vectorize() function in doing that? I have read
> >  many threads where experts suggest to Vectorize the function, which
> >  will speed up entire calculation (and more elegant ofcourse.)
> >
> >  I used to think that vectorizing function means, to create a
> >  function such a way so that if input(s) are vector then this
> >  function will also return a vector output (without having any extra
> >  effort like use of 'for' loop etc.) Is this understanding correct?
> >
> >  Here I have tried 2 essentially similar functions:
> >
> >>  fn1<- function(x,y,z) return(x+y+z)
> >>  fn2<- Vectorize(function(x,y,z) return(x+y+z), SIMPLIFY=TRUE)
> >>  fn1(1:3, 4:6,5)
> >  [1] 10 12 14
> >>  fn2(1:3, 4:6,5)
> >  [1] 10 12 14
> >
> >
> >  You see that, fn1() and fn2() is giving same answer (vectorized?)
> >  despite of the fact that fn1() is not wrapped within Vectorize()
> >  function. Therefore I want to know: what additional thing this
> >  Vectorize() function brings on the table?
>
> That is because you used "+"  which is "vectorized" to start with. Try
> is with "sum" and you will not be as "happy"
>   >  sum(a=1:3, b=4:6, cc=7:9)
> [1] 45
>
> It removed all your structure.
>
>   >  Vsum<-function(...) {what<- list(...); lenlist<- length(what);
> y<-matrix(unlist(what), ncol=lenlist); apply(y,1,sum)}
>   >  Vsum(a=1:3, b=4:6, cc=7:9)
> [1] 12 15 18
> # Does not recycle as I might have expected, although it does recycle
>   >  (Vsum( a=1:3, b=4:6, cc=7))
> [1] 12  8 11
>
>
>   >  (mapply(sum, a=1:3, b=4:6, cc=7:9))
>    # also works and recycles as expected:
> [1] 12 15 18
>
>   >  (mapply(sum, a=1:3, b=4:6, cc=7))
> [1] 12 14 16
>
> # but _not_ VSum<- Vectorize(sum) for reasons not clear to me behaves
> the same as sum()

The problem with Vectorize(sum) is that Vectorize doesn`t see any 
parameters to vectorize in sum().  It needs simple functions with 
parameters like fn1, and it rewrites them to loop over the values of the 
parameters.

Duncan Murdoch



More information about the R-help mailing list