Простой вопрос относительно использования external () и пользовательских функций? - PullRequest
17 голосов
/ 05 апреля 2011
> 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]

Почему fun2 () не работает?Разве fun2 () и fun1 () не одно и то же?

Ответы [ 2 ]

15 голосов
/ 24 сентября 2015

В качестве альтернативы вы можете просто заменить fun2 на Vectorize(fun2) при передаче его в качестве аргумента 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))
6 голосов
/ 05 апреля 2011

Ответ становится очевидным, если вы прочитаете ?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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...