# [R] Problem using outer()

John Smith johns2326 at hotmail.com
Thu Jan 16 15:47:02 CET 2003

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

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

```