# [R] Problem using outer()

Petr Pikal petr.pikal at precheza.cz
Thu Jan 16 17:34:03 CET 2003

Hi

On 16 Jan 2003 at 9:41, John Smith wrote:

> Here is a problem I am having. I would sincerely appreciate any
> help/advice from the experts who read this list. I have contrived a
> simple example, but it gives the same result I encountered in a more
> complicated application.
>
> Given data frame u:
>
> x	y
> 31	19
> 32	18
> 33	17
> 34	16
> 35	15
> 36	14
> 37	13
>
> I define the function f as follows:
>
> f <- function(a,b) sum(u\$x - a) + sum(u\$y - b)

try this one

f<-function(a,b) colSums(outer(u\$x,a,"-"))+colSums(outer(u\$y,b,"-"))

Though I am not sure if it is quicker then for loop :-)

>
> One might think of a and b as "mean" values, and the function f totals
> up the deviations.
>
> I wish to generate a table of the value of f given various values of a
> and b along grid points. So I define:
>
> aa <- seq(0.1,1.0,0.1)
> bb <- seq(1.0,2.0,0.1)
>
> Unfortunately, when I issue the command
>
> s <- outer(aa,bb,f)
>
> R tells me the following:
>
> Warning messages:
> 1: longer object length
>         is not a multiple of shorter object length in: u\$x - a
> 2: longer object length
>         is not a multiple of shorter object length in: u\$y - b
>
> Outer() does assign values to s, but they are values that do not make
> sense. I understand why this is happening. Outer() passes the vectors
> aa and bb to function f, where the statement sum(u\$x - a) + sum(u\$y -
> b) is encountered with u\$x and u\$y of length 7 and a and b of length
> 10. R then cannot apply the recycle rule.
>
> I can do this simply enough with nested loops and get the correct
> answer. Unfortunately, the "real" problem is much more involved than
> the simple example I show here (data frame u contains hundreds of
> observations, and the function f is many lines long) so the solution
> takes some time. The R documentation stresses in a number of places
> that loops are inefficient and should be eliminated where possible. I
> thought using outer() would speed the application up, but it doesn't
> work.
>
> Any suggestions? How can I build up the table of values without using
> nested loops?
>
> John Shonder
>

Petr Pikal
Precheza a.s., Nabř.Dr.E.BeneÜe 24, 750 62 Přerov
tel: +420581 252 257 ; 724 008 364
petr.pikal at precheza.cz; p.pik at volny.cz
fax +420581 252 561