tag - ¿Pregunta simple sobre el uso de funciones externas() y definidas por el usuario?
tag questions uso de have to (2)
> fun1 <- function(x,y){x+y}
> outer(seq(1,5,length=5),seq(6,10,length=5),fun1)
[,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
> fun2 <- function(x,y){z<-c(x,y);z[1]+z[2]}
> outer(seq(1,5,length=5),seq(6,10,length=5),fun2)
Error in dim(robj) <- c(dX, dY) :
dims [product 25] do not match the length of object [1]
¿Por qué no funciona fun2 ()? ¿No son fun2 () y fun1 () esencialmente lo mismo?
Como alternativa, puede reemplazar fun2
con Vectorize(fun2)
cuando se lo pasa como argumento al outer
:
fun2 <- function(x,y){z<-c(x,y);z[1]+z[2]}
outer(seq(1,5,length=5),seq(6,10,length=5), Vectorize(fun2))
La respuesta se vuelve obvia si lees ?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.
Piense en lo que está haciendo, está concatenando dos vectores en un solo vector, luego sume los elementos primero y segundo de este vector. fun1()
por otro lado hace la suma vectorizada de las entradas, por lo que el objeto devuelto es de la misma longitud que las longitudes individuales de las entradas. En fun2()
, la salida es un vector de longitud 1 y esperaba 25.
La manera de hacer que la idea detrás de fun2()
funcione es cbind()
no c()
las dos entradas:
> 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