Greetings R-help community, I am relatively new to R, which may be why I am having trouble understanding this problem. I am trying to use outer() to generate a graphable surface of a function. If there is a better way to do this, I would appreciate the insight. Otherwise, could someone suggest a method to get the outer() function to work here? Below is my simplified R program. Further down is the output. Thanks in advance, Kyle ################### data <- c(0, 1, 2, 3) x <- c(0,2,4) y <- c(0,1,2) f <- function(x, y) sum(data*x)+y f(0,0); f(2,0); f(4,0); f(0,1); f(2,1); f(4,1); f(0,2); f(2,2); f(4,2); outer(x, y, f) f <- function(x, y) x-x+y-y+force(sum(data^x)) outer(x, y, f) ##################################> data <- c(0, 1, 2, 3) > x <- c(0,2,4) > y <- c(0,1,2) > > f <- function(x, y) sum(data*x)+y > f(0,0); f(2,0); f(4,0);[1] 0 [1] 12 [1] 24> f(0,1); f(2,1); f(4,1);[1] 1 [1] 13 [1] 25> f(0,2); f(2,2); f(4,2);[1] 2 [1] 14 [1] 26> outer(x, y, f)[,1] [,2] [,3] [1,] 20 21 22 [2,] 20 21 22 [3,] 20 21 22 Warning message: longer object length is not a multiple of shorter object length in: data * x
On Thu, 23 Mar 2006, Kyle LaMalfa wrote:> Greetings R-help community, > > I am relatively new to R, which may be why I am having trouble > understanding this problem. I am trying to use outer() to generate a > graphable surface of a function. If there is a better way to do this, > I would appreciate the insight. Otherwise, could someone suggest a > method to get the outer() function to work here? >It's a FAQ (7.17). -thomas> Below is my simplified R program. Further down is the output. > > Thanks in advance, > Kyle > > ################### > > data <- c(0, 1, 2, 3) > x <- c(0,2,4) > y <- c(0,1,2) > > f <- function(x, y) sum(data*x)+y > f(0,0); f(2,0); f(4,0); > f(0,1); f(2,1); f(4,1); > f(0,2); f(2,2); f(4,2); > outer(x, y, f) > > f <- function(x, y) x-x+y-y+force(sum(data^x)) > outer(x, y, f) > > ################################## > >> data <- c(0, 1, 2, 3) >> x <- c(0,2,4) >> y <- c(0,1,2) >> >> f <- function(x, y) sum(data*x)+y >> f(0,0); f(2,0); f(4,0); > [1] 0 > [1] 12 > [1] 24 >> f(0,1); f(2,1); f(4,1); > [1] 1 > [1] 13 > [1] 25 >> f(0,2); f(2,2); f(4,2); > [1] 2 > [1] 14 > [1] 26 >> outer(x, y, f) > [,1] [,2] [,3] > [1,] 20 21 22 > [2,] 20 21 22 > [3,] 20 21 22 > Warning message: > longer object length > is not a multiple of shorter object length in: data * x > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html >Thomas Lumley Assoc. Professor, Biostatistics tlumley at u.washington.edu University of Washington, Seattle
This is a FAQ: http://cran.r-project.org/doc/manuals/R-FAQ.html#Why-does-outer_0028_0029-behave-strangely-with-my-function_003f On 3/23/06, Kyle LaMalfa <kylelamalfa at gmail.com> wrote:> Greetings R-help community, > > I am relatively new to R, which may be why I am having trouble > understanding this problem. I am trying to use outer() to generate a > graphable surface of a function. If there is a better way to do this, > I would appreciate the insight. Otherwise, could someone suggest a > method to get the outer() function to work here? > > Below is my simplified R program. Further down is the output. > > Thanks in advance, > Kyle > > ################### > > data <- c(0, 1, 2, 3) > x <- c(0,2,4) > y <- c(0,1,2) > > f <- function(x, y) sum(data*x)+y > f(0,0); f(2,0); f(4,0); > f(0,1); f(2,1); f(4,1); > f(0,2); f(2,2); f(4,2); > outer(x, y, f) > > f <- function(x, y) x-x+y-y+force(sum(data^x)) > outer(x, y, f) > > ################################## > > > data <- c(0, 1, 2, 3) > > x <- c(0,2,4) > > y <- c(0,1,2) > > > > f <- function(x, y) sum(data*x)+y > > f(0,0); f(2,0); f(4,0); > [1] 0 > [1] 12 > [1] 24 > > f(0,1); f(2,1); f(4,1); > [1] 1 > [1] 13 > [1] 25 > > f(0,2); f(2,2); f(4,2); > [1] 2 > [1] 14 > [1] 26 > > outer(x, y, f) > [,1] [,2] [,3] > [1,] 20 21 22 > [2,] 20 21 22 > [3,] 20 21 22 > Warning message: > longer object length > is not a multiple of shorter object length in: data * x > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html >
While it is true that the FAQ on 'outer' technically covers this problem, this isn't the typical case and may still be puzzling to the original poster. The typical problem with 'outer' is that the function returns a scalar even when the input is a vector with multiple elements. The function in this case is vectorized in the sense that it returns the same number of elements as its input. The problem is that the elements are not independent. The stricter sense of vectorization that 'outer' requires is that a subset of the elements of the input returns the corresponding subset of elements of the result. This is not true for the function in this example, and is where the trouble lies. Patrick Burns patrick at burns-stat.com +44 (0)20 8525 0696 http://www.burns-stat.com (home of S Poetry and "A Guide for the Unwilling S User") Kyle LaMalfa wrote:>Greetings R-help community, > >I am relatively new to R, which may be why I am having trouble >understanding this problem. I am trying to use outer() to generate a >graphable surface of a function. If there is a better way to do this, >I would appreciate the insight. Otherwise, could someone suggest a >method to get the outer() function to work here? > >Below is my simplified R program. Further down is the output. > >Thanks in advance, >Kyle > >################### > > data <- c(0, 1, 2, 3) > x <- c(0,2,4) > y <- c(0,1,2) > > f <- function(x, y) sum(data*x)+y > f(0,0); f(2,0); f(4,0); > f(0,1); f(2,1); f(4,1); > f(0,2); f(2,2); f(4,2); > outer(x, y, f) > > f <- function(x, y) x-x+y-y+force(sum(data^x)) > outer(x, y, f) > >################################## > > > >>data <- c(0, 1, 2, 3) >>x <- c(0,2,4) >>y <- c(0,1,2) >> >>f <- function(x, y) sum(data*x)+y >>f(0,0); f(2,0); f(4,0); >> >> >[1] 0 >[1] 12 >[1] 24 > > >>f(0,1); f(2,1); f(4,1); >> >> >[1] 1 >[1] 13 >[1] 25 > > >>f(0,2); f(2,2); f(4,2); >> >> >[1] 2 >[1] 14 >[1] 26 > > >>outer(x, y, f) >> >> > [,1] [,2] [,3] >[1,] 20 21 22 >[2,] 20 21 22 >[3,] 20 21 22 >Warning message: >longer object length > is not a multiple of shorter object length in: data * x > >______________________________________________ >R-help at stat.math.ethz.ch mailing list >https://stat.ethz.ch/mailman/listinfo/r-help >PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html > > > >