我有一个代码需要很长时间才能运行。根据我的粗略估计,在我想要测试的一组组合上运行它需要几天时间,所以我总是在较小的一组上运行它。出于这个原因,我希望我可以将其转换为 foreach 循环结构以利用多核处理器。我一直在努力将以下代码转换为 foreach 循环。
pcall=c
lcall=d
pandlcall=c()
pandl=c()
cltime=c()
clpr=c()
for (i in 1:(dim(poss)[1]-1)) {
for (j in 1:(length(b)-poss[i,2])) {
if ((b[poss[i,2]+j]-b[poss[i,2]])/b[poss[i,2]]>=pcall) {
pandlcall[i]=1
pandl[i]=(b[poss[i,2]+j]-b[poss[i,2]])/b[poss[i,2]]
cltime[i]=poss[i,2]+j
clpr[i]=b[poss[i,2]+j]
break
} else {
if ((b[poss[i,2]+j]-b[poss[i,2]])/b[poss[i,2]]<=lcall) {
pandlcall[i]=-1
pandl[i]=(b[poss[i,2]+j]-b[poss[i,2]])/b[poss[i,2]]
cltime[i]=poss[i,2]+j
clpr[i]=b[poss[i,2]+j]
break
} else {
next
}
}
}
}
基本上我正在尝试创建一个外汇回测。如您所见,上面的代码在制定特定的损益标准时保存了特定的值。在运行了两个循环之后,我想要一个 data.frame pandlcall, pandl, cltime, clpr
,这就是为什么我在每次迭代期间将此值保存为向量的原因。b
并且poss
是另一个 data.frames,如您所见,我在其上运行循环。
几天来我一直在努力重新制作它,以便它可以用于 dopar foreach。在我的试验和错误中,我替换了将向量中的值保存到列表中,所以我没有例如pandlcall[i]=1
我有reslist[[1]][i]=1
,所以最后我没有 data.frame 而是一个列表。在循环之前,我创建了这个空列表reslist=list(pandlcall,pandl,cltime,clprice)
。
对于这两个基本的 for 循环 (i & j),它可以工作,但是当我用 foreach 循环“替换”外部 for 循环时,它当然不起作用。我的想法就像我会创建一个包含这 4 个对象(“向量”)的列表,每个第 i 个循环都会在每个对象的第 i 个位置上放置一个值。