Ответ становится очевидным, если вы прочитаете ?outer
:
Details:
‘X’ and ‘Y’ must be suitable arguments for ‘FUN’. Each will be
extended by ‘rep’ to length the products of the lengths of ‘X’ and
‘Y’ before ‘FUN’ is called.
‘FUN’ is called with these two extended vectors as arguments.
Therefore, it must be a vectorized function (or the name of one),
expecting at least two arguments.
Подумайте о том, что вы делаете, вы объединяете два вектора в один вектор, затем сложите первый и второй элементы этого вектора.fun1()
с другой стороны делает векторизованную сумму входных данных, поэтому возвращаемый объект имеет ту же длину, что и отдельные длины входных данных.В fun2()
выводом является вектор длины 1, и он ожидал 25.
Способ сделать идею, стоящую за fun2()
работой, состоит в том, чтобы cbind()
не c()
два входа:
> fun3 <- function(x, y) { z <- cbind(x, y); z[,1] + z[,2]}
> outer(seq(1,5,length=5),seq(6,10,length=5),fun3)
[,1] [,2] [,3] [,4] [,5]
[1,] 7 8 9 10 11
[2,] 8 9 10 11 12
[3,] 9 10 11 12 13
[4,] 10 11 12 13 14
[5,] 11 12 13 14 15