> 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]
Run Code Online (Sandbox Code Playgroud)
为什么fun2()不起作用?不是fun2()和fun1()基本上是一回事吗?
Dan*_*tti 15
作为替代方案,您可以替换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))
Run Code Online (Sandbox Code Playgroud)
如果您阅读?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.
Run Code Online (Sandbox Code Playgroud)
想想你正在做什么,你将两个向量连接成一个向量,然后对这个向量的第一个和第二个元素求和.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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6581 次 |
最近记录: |