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
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
For anyone who may be having a similar problem, here is the solution (thanks to Peter Dalgaard and a search of the archives): g <- function(a,b) sapply(seq(along=a),function(i) f(a[i],b[i])) s <- outer(aa,bb,g) Looking at the archives it seems many have had the same problem. At least I'm in good company! Many thanks to those who responded. John Shonder> >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 >