# Easily parallelize R nested for loop with foreach?

I have this triple loop with the output all being written to the same array, asc.a.out. I was wondering if there is a simple way to parallelize this, I tried foreach (now commented out), but the output array was empty. Is there a simple way to speed up constructs like this, I remember in MATLAB loops could simply be converted to parallel loops without any major code changes, much like openmp. The reason my data is within this structure is because it's spatial data with a time series at each location.

edit: I have added a simple example at the end.

``````asc.a     = array(55,dim=c(120,180,2190)) # filled with nonsense data as an example.
asc.a.out = array(NaN,dim=c(120,180,426))

for (i in 1:120) {
#foreach (i = 1:120) %dopar% {
for (j in 1:180) {

yy = seq(1:2190)

asc.a.b = rbind(asc.a[i,j,1:365],asc.a[i,j,366:730],asc.a[i,j,731:1095],asc.a[i,j,1096:1460],asc.a[i,j,1461:1825],asc.a[i,j,1826:2190])
asc.a.b = cbind(asc.a.b[,335:365],asc.a.b,asc.a.b[,1:30])

asc.a.c = c(asc.a[i,j,1:365],asc.a[i,j,366:730],asc.a[i,j,731:1095],asc.a[i,j,1096:1460],asc.a[i,j,1461:1825],asc.a[i,j,1826:2190])

check = asc.a.c
check = sort(asc.a.c,decreasing = T)
if (sum(!is.na(check[1:365])) < 100) next

model <- rlm(asc.a.c ~ poly(yy,25))
predicted.intervals <- predict(model,data.frame(x=yy),interval='confidence',level=0.99)

asc.a.c.tmp = asc.a.c - predicted.intervals[,1]

sd = sd(asc.a.c.tmp,na.rm=T)
med = median(asc.a.c.tmp,na.rm=T)
q25 = quantile(asc.a.c.tmp,na.rm=T)
asc.a.c.tmp[asc.a.c.tmp < (0-sd)] = NaN
asc.a.c.tmp[asc.a.c.tmp > (0+sd)] = NaN

asc.clim = asc.a.c.tmp + predicted.intervals[,1]
asc.a.d = rbind(asc.clim[1:365],asc.clim[366:730],asc.clim[731:1095],asc.clim[1096:1460],asc.clim[1461:1825],asc.clim[1826:2190])
asc.a.d = cbind(asc.a.d[,335:365],asc.a.d,asc.a.d[,1:30])

for (k in 16:411) {

tmp1 = asc.a.b[,((k-15):(k+15))]
tmp = quantile(asc.a.d[,((k-15):(k+15))],na.rm=T)

tmp1[tmp1 < tmp[2]] = NaN
tmp1[tmp1 > tmp[4]] = NaN

asc.a.out[i,j,k] = mean(tmp1,na.rm=T)
}
}
print(i)
}
``````

edit: smaller example with same code structure as above.

``````asc.a     = array(55,dim=c(120,180,426))
asc.a.out = array(NaN,dim=c(120,180,426))

for (i in 1:120) {
#foreach (i = 1:120) %dopar% {
for (j in 1:180) {

tmp = asc.a[i,j,]

for (k in 16:411) {
tmp1 = tmp[((k-15):(k+15))]
asc.a.out[i,j,k] = mean(tmp1,na.rm=T)
}
}
print(i)
}
``````