R中最有效的嵌套循环组合

R中最有效的嵌套循环组合,r,loops,R,Loops,我尝试运行四个嵌套循环,如下所示。我试图找到MA1、MA2、SL和LS的最佳组合。为了保持简单,我向你展示了我在中间运行评论的例子。如下图所示,MA1为1-364,MA2为2-365,SL和LS为.001-.05。我将其设置为MA2总是比MA1多启动一个,因为检查1和2与检查2和1相同(在本例中) main一种更像R的方法是建立一个输入矩阵,然后对它们进行检查。我在这里是为你做的。我将LS和SL的粒度减少了一半,以使结束大小更合理一些,但是生成的grid2对象仍然有41518750个参数组合。。

我尝试运行四个嵌套循环,如下所示。我试图找到MA1、MA2、SL和LS的最佳组合。为了保持简单,我向你展示了我在中间运行评论的例子。如下图所示,MA1为1-364,MA2为2-365,SL和LS为.001-.05。我将其设置为MA2总是比MA1多启动一个,因为检查1和2与检查2和1相同(在本例中)

main一种更像R的方法是建立一个输入矩阵,然后对它们进行检查。我在这里是为你做的。我将
LS
SL
的粒度减少了一半,以使结束大小更合理一些,但是生成的
grid2
对象仍然有41518750个参数组合。。。你真的需要所有这些吗

MA1 = 1:364
MA2 = 2:365
SL = seq(0, 0.05, by = 0.002)[-1]
LS = seq(0, 0.05, by = 0.002)[-1]

grid1 = expand.grid(MA1, MA2)
names(grid1) = c("MA1", "MA2")
grid1 = grid1[grid1$MA1 < grid1$MA2, ]
grid2 = expand.grid(1:nrow(grid1), SL, LS)
names(grid2) = c("g1row", "SL", "LS")
grid2 = cbind(grid2, grid1$MA1[grid2$g1row], grid1$MA2[grid2$g1row])
names(grid2)[4:5] = c("MA1", "MA2")
grid2$g1row = NULL
MA1=1:364
MA2=2:365
SL=seq(0,0.05,by=0.002)[-1]
LS=seq(0,0.05,by=0.002)[-1]
grid1=展开.grid(MA1,MA2)
名称(网格1)=c(“MA1”、“MA2”)
grid1=grid1[grid1$MA1
通过此设置,嵌套循环可以替换为
grid2
行上的单个循环,也可以使用
apply
mapply
重写它。为结果预先分配一个向量或列表,如果使用for循环,则填写该向量或列表


这种方法的另一个优点是,它非常清楚您使用的变量范围。这有助于减少bug。例如,在您的代码中,您的描述和代码之间存在不匹配:您说
MA1
从1到364,但在您的代码中,您将其初始化为1,然后立即添加1,当您到达第一个
n时,它从2开始。您大约有146个什么?首先设置所有组合,使用
expand.grid
获取所有要迭代的
MA1
MA2
SL
LS
的组合,然后甚至可以对函数进行向量化。循环在R中通常很慢。我认为真正的问题是为什么要这样做?可能有一个更简单的解决方案。用文字描述代码的目标。更好的是,提供一个输入数据示例,以便我们可以运行和比较不同的实现。您应该使用
microbenchmark
计算
FindPnL
的单个迭代需要多长时间。然后将这个数字乘以你尝试的排列数(在我看来是150毫米)。如果这个数字对于您的意图和目的来说太大,那么您如何循环函数就无关紧要了。您要么需要使函数更快,要么需要缩小采样空间。
MA1 = 1:364
MA2 = 2:365
SL = seq(0, 0.05, by = 0.002)[-1]
LS = seq(0, 0.05, by = 0.002)[-1]

grid1 = expand.grid(MA1, MA2)
names(grid1) = c("MA1", "MA2")
grid1 = grid1[grid1$MA1 < grid1$MA2, ]
grid2 = expand.grid(1:nrow(grid1), SL, LS)
names(grid2) = c("g1row", "SL", "LS")
grid2 = cbind(grid2, grid1$MA1[grid2$g1row], grid1$MA2[grid2$g1row])
names(grid2)[4:5] = c("MA1", "MA2")
grid2$g1row = NULL