¿Por qué no funciona el exterior como creo que debería (en R)?

Impulsado por @ hadley'sArtículo sobre los funcionarios referenciados en una respuesta hoy., Decidí revisar un enigma persistente acerca de cómoouter La función funciona (o no). ¿Por qué falla esto?

outer(0:5, 0:6, sum) # while outer(0:5, 0:6, "+") succeeds

Esto muestra como piensoouter debería manejar una función comosum:

 Outer <- function(x,y,fun) {
   mat <- matrix(NA, length(x), length(y))
   for (i in seq_along(x)) {
            for (j in seq_along(y)) {mat[i,j] <- fun(x[i],y[j])} }
   mat}

>  Outer(0:5, 0:6, `+`)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    0    1    2    3    4    5    6
[2,]    1    2    3    4    5    6    7
[3,]    2    3    4    5    6    7    8
[4,]    3    4    5    6    7    8    9
[5,]    4    5    6    7    8    9   10
[6,]    5    6    7    8    9   10   11

OK, no tengo mis índices exactamente alineados para ese ejemplo, pero no sería tan difícil de corregir. La pregunta es por qué una función comosum que debería poder aceptar dos argumentos y devolver un valor (atómico) adecuado para un elemento de matriz, no puede hacerlo cuando se pasa a labase::outer ¿función?

Así que @agstudy ha inspirado para una versión más compacta deOuter y el suyo es aún más compacto:

 Outer <- function(x,y,fun) {
       mat <- matrix(mapply(fun, rep(x, length(y)), 
                                 rep(y, each=length(x))),
                     length(x), length(y))

Sin embargo, la pregunta sigue siendo. El término "vectorizado" es un tanto ambiguo aquí y creo que "diádico" es más correcto, ya quesin ycos Están "vectorizados" en el sentido habitual del término. ¿Hay una barrera lógica fundamental para esperar?outer para expandir sus argumentos de manera que se puedan usar funciones no diádicas.

Y aquí hay otraouter-error que probablemente esté conectado de forma similar a mi falta de comprensión de este problema:

> Vectorize(sum)
function (..., na.rm = FALSE)  .Primitive("sum")
>  outer(0:5, 0:6, function(x,y) Vectorize(sum)(x,y) )
Error in outer(0:5, 0:6, function(x, y) Vectorize(sum)(x, y)) : 
  dims [product 42] do not match the length of object [1]

Respuestas a la pregunta(1)

Su respuesta a la pregunta