在R中传递2个以上的向量

在R中传递2个以上的向量,r,R,我想计算a=-1:1和b=-1:1上的e^(ax+b),计算X的各种值。我希望以5个元素的列表形式输出。列表中的每个元素都是3X3矩阵 我确实使用了外部和矢量化实现了这一点 sigm = function(a=0,b=0,x){ return(exp(x*a+b)) } sigm1 = Vectorize(function(a=-1:1,b=-1:1,x){ outer(a,b,sigm,x) },SIMPLIFY = FALSE) 现在,sigm1(x=1:3)给出了所需的输

我想计算a=-1:1和
b=-1:1
上的
e^(ax+b),计算
X
的各种值。我希望以5个元素的列表形式输出。列表中的每个元素都是3X3矩阵

我确实使用了外部和矢量化实现了这一点

 sigm = function(a=0,b=0,x){
 return(exp(x*a+b))
 }

 sigm1 = Vectorize(function(a=-1:1,b=-1:1,x){

 outer(a,b,sigm,x)
 },SIMPLIFY = FALSE)
现在,
sigm1(x=1:3)
给出了所需的输出

 [[1]]
      [,1]      [,2]     [,3]
 [1,] 0.1353353 0.3678794 1.000000
 [2,] 0.3678794 1.0000000 2.718282
 [3,] 1.0000000 2.7182818 7.389056

[[2]]
       [,1]      [,2]       [,3]
[1,] 0.04978707 0.1353353  0.3678794
[2,] 0.36787944 1.0000000  2.7182818
[3,] 2.71828183 7.3890561 20.0855369

[[3]]
       [,1]        [,2]       [,3]
[1,] 0.01831564  0.04978707  0.1353353
[2,] 0.36787944  1.00000000  2.7182818
[3,] 7.38905610 20.08553692 54.5981500
这个代码片段的唯一缺点是我使用了默认值
a=-1:1
b=-1:1
。当我试图在函数调用过程中传递相同的消息时,它就失控了。例如

sigm1(-1:1,-1:1,1:3)

[[1]]
      [,1]
[1,] 0.1353353

[[2]]
 [,1]
[1,]    1

[[3]]
     [,1]
[1,] 54.59815

我无法理解为什么传递参数会使输出产生这种差异

您可以使用
sapply
创建矢量化函数

从文档中可以看到:“在
vectorize.args
参数到
vectorize
中命名的参数是在
列表中传递到
mapply
的参数。只有那些实际传递的参数才会被向量化;默认值不会。”因此,当传递参数时,它在所有三个参数上进行矢量化([a=-1,b=-1,x=1],然后[a=0,b=0,x=2],然后[a=1,b=1,x=3])。
sigm = function(a, b, x){
    return(lapply(x, function(xx) sapply(b, function(bb)
        sapply(a, function(aa) exp(xx*aa+bb)))))
}
sigm(a = -1:1, b = -1:1, x = 1:3)
#[[1]]
#          [,1]      [,2]     [,3]
#[1,] 0.1353353 0.3678794 1.000000
#[2,] 0.3678794 1.0000000 2.718282
#[3,] 1.0000000 2.7182818 7.389056

#[[2]]
#           [,1]      [,2]       [,3]
#[1,] 0.04978707 0.1353353  0.3678794
#[2,] 0.36787944 1.0000000  2.7182818
#[3,] 2.71828183 7.3890561 20.0855369

#[[3]]
#           [,1]        [,2]       [,3]
#[1,] 0.01831564  0.04978707  0.1353353
#[2,] 0.36787944  1.00000000  2.7182818
#[3,] 7.38905610 20.08553692 54.5981500