我想在所有参数组合上调用一个函数。
为此,我尝试了outer
:
> outer(c(0,6,7),c(100,10,1,0.1,0.01),FUN=list)
Error in outer(c(0, 6, 7), c(100, 10, 1, 0.1, 0.01), FUN = list) :
dims [product 15] do not match the length of object [2]
我可以使用嵌套的lapply
得到我想要的东西:
do.call(c,lapply(c(0,6,7),function(type)
lapply(c(100,10,1,0.1,0.01),function(cost)
list(type=type,cost=cost)))
但我想知道是否有更好的解决方案(特别是如果我有两个以上的变量,比如epsilon
和type
除了cost
。
答案 0 :(得分:3)
如何使用expand.grid
来获取所有组合。通用对任意数量的向量(参数)。然后,您可以使用apply
。觉得有点乱,但做得好......
# stick your function in the apply loop
args <- expand.grid( c(0,6,7) , c(100,10,1,0.1,0.01) )
apply( args , 1 , function(x) x[1] * x[2] )
或者,data.table
的交叉连接功能 - CJ
功能(基本上与expand.grid
完全相同)可以派上用场,同时还可以评估j
的{{1}}中的函数...
data.table
答案 1 :(得分:0)
data.table
的{{1}}做了类似的事情:
CJ
如果您希望使用CJ(type = c(0, 6, 7), cost = c(100, 10, 1, 0.1, 0.01))
type cost
1: 0 2e-02
2: 0 1e-01
3: 0 1e+00
4: 0 1e+01
5: 0 1e+02
6: 6 2e-02
7: 6 1e-01
8: 6 1e+00
9: 6 1e+01
10: 6 1e+02
11: 7 2e-02
12: 7 1e-01
13: 7 1e+00
14: 7 1e+01
15: 7 1e+02
答案 2 :(得分:0)
您可以使用expand.grid
和mapply
:
tmp = expand.grid(c(0,6,7),c(100,10,1,0.1,0.01))
do.call(".mapply", ##".mapply" seems handier for this since you don't have to specify each `...` argument
c(function(x, y) list(type = x, cost = y),
list(unname(tmp)),
list(NULL)))