[R] problems with outer

Bill Venables Bill.Venables at cmis.csiro.au
Sun May 7 05:35:57 CEST 2000


At 10:57 PM 5/6/00 -0400, Faheem Mitha wrote:
>(replying to my own message)
>
>Ok, I took a look around, and what I think vectorised means is that if x
>and y are two vectors, then the shorter of the vectors is replicated to be
>the length of the longer of the two vectors, ie. the elements of the
>shorter vector are repeated as necessary (thus the two vectors become the
>same length) and then a vector of function values is returned that is the
>value of the function elementwise on these two vectors. (Thanks to S
>Burn's `S Poetry' for a clear explanation of this on pg 4). 

It is a clear, concise and simple explanation, but sadly incomplete and for
your purposes rather misleading...  Darn!

>I am still not clear how I would vectorise my function though, assuming 
>that it only accepts scalar values.

How you do that is up to you.  There is no magic formula.  Sometimes
efficiency requires you to go right down to the C code (or extension) level
and write a fast loop.  

>
>Cam some kind person in any case confirm that this is what was meant?
>
>f.vect <- function(x,y) sapply(seq(along=x),function(i)f(x[i],y[i]))
>
>seems to be to only work correctly if x and y are the same length.

Call me unkind, but this is precisely the kind of discussion I was seeking
to avoid in public as it gets so messy.  It takes a dialogue.
"Vectorization" is a rather slippery concept that means different things in
different contexts.  It may involve the recycling rule or it may not,
depending.

Take an example.  If I write

f <- function(x, y) x + y

this function will work with outer(), but it depends on a rather different
vectorization property than just the recycling rule.  In this case it works
because if either x or y are vectors (but not both), the result is a vector
of that length.  Note that if I use f(1:3, 2) or f(2, 1:3) the recycling
rule is used, but it is not used in, say, outer(1:3, 0:5, f) (which you
should check).

So your function to be supplied to outer() should

>                        Sincerely, Faheem Mitha.
>
>On Sat, 6 May 2000, Faheem Mitha wrote:
>
>> 
>> 
>> On 7 May 2000, Peter Dalgaard BSA wrote:
>> 
>> > Faheem Mitha <faheem at email.unc.edu> writes:
>> > 
>> > > Note that my function tempexpbinsumsq merely exists for the purpose of
>> > > outer. I could have done 
>> > > tempmatrix <-
>> > > outer(x,y,function(x,y) expbinsumsq(point,pair,x,y,a,b,theta))
>> > > but I don't know if that would be correct usage.
>> > > 
>> > > Can someone explain what is going on? I'm at my wits end.
>> > 
>> > The thing that usually tricks beginners with outer() is that the
>> > function has to be vectorised. I.e. if you stick in vectors for x and
>> > y, you get a vector result back. Otherwise, you have to vectorise it
>> > yourself, e.g. if f takes scalar arguments,
>> > 
>> > f.vect <- function(x,y) sapply(seq(along=x),function(i)f(x[i],y[i]))
>> 
>> This is helpful. However I'd like to clarify the meaning of vectorisation
>> in this case.
>> 
>> Does a vectorised function with two arguments mean that if X, Y vectors
>> then f(X,Y)= (f(X_i,Y_i)), ie f(X,Y) is the vector with component
>> f(X_i,Y_i)?
>> 
>> This is what appears to be the case from the line beginning f.vect above.
>> In particular, this would force x and y to be the same length. If this is
>> not the case then I am puzzled how f.vect would be what I want.
>> 
>> A priori, I could have taken this to mean that f must satisfy the
>> following:
>>  
>> If X is a vector, and y is a scalar, then f(X,y) = (f(X_i,y)) ie f(X,y) is
>> the vector with components (f(X_i,y) and similarly for f(x,Y). But this is
>> not what you mean, is it?
>> 
>> Please excuse any confusion. Trying to debug stuff always wears me out, so
>> I am not at my best right now.
>> 
>> Thanks.                          Faheem.
>> 
>>  -- 
>> >    O__  ---- Peter Dalgaard             Blegdamsvej 3  
>> >   c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
>> >  (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
>> > ~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)             FAX: (+45) 35327907
>> > 
>> 
>> 
>> 
>
>-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
.-.-
>r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
>Send "info", "help", or "[un]subscribe"
>(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
>_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
._._
>
>
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._



More information about the R-help mailing list