Tôi có một chức năng có chứa một vòng lặpvòng lặp bên trong một vòng lặp foreach sử dụng doparallel
myfun = function(z1.d, r, rs){
x = z1.d[,r]
or.d = order(as.vector(x), decreasing=TRUE)[rs]
zz1.d = as.vector(x)
r.l = zz1.d[or.d]
y=vector()
for (i in 1:9)
{
if(i<9) y[i]=mean(x[(x[,r] >= r.l[i] & x[,r] < r.l[i+1]),r]) else{
y[i] = mean(z1.d[(x >= r.l[9]),r])}
}
return(y)
}
rs là một vector số, z1.d là một sở thú và y cũng là một vector số.
Khi tôi cố gắng để chạy các chức năng bên trong một vòng lặp song song:
cls = makePSOCKcluster(8)
registerDoParallel(cls)
rlarger.d.1 = foreach(r=1:dim(z1.d)[2], .combine = "cbind") %dopar% {
myfun(z1.d, r, rs)}
stopCluster(cls)
tôi nhận được lỗi sau:
Error in { : task 1 failed - "incorrect number of dimensions"
Tôi không biết tại sao, nhưng tôi nhận ra nếu tôi lấy lặp lại chức năng của tôi, nó không đưa ra lỗi.
Ngoài ra, nếu tôi chạy cùng mã chính xác với% do% thay vì% dopar% (do đó không chạy song song) nó hoạt động tốt (chậm nhưng không có lỗi).
EDIT: theo yêu cầu ở đây là một mẫu của các thông số:
dim(z1.d)
[1] 8766 107
> z1.d[1:4,1:6]
AU_10092 AU_10622 AU_12038 AU_12046 AU_13017 AU_14015
1966-01-01 23:00:00 NA NA NA 1.816 0 4.573
1966-01-02 23:00:00 NA NA NA 9.614 0 4.064
1966-01-03 23:00:00 0 NA NA 0.000 0 0.000
1966-01-04 23:00:00 0 NA NA 0.000 0 0.000
> rs
[1] 300 250 200 150 100 75 50 30 10
r được định nghĩa trong vòng lặp foreach
Đầu vào mẫu của thông số z1.d, rs, r sẽ hữu ích. – TUSHAr
@sbg - Bạn đang chạy hệ điều hành nào. Trong bối cảnh thực hiện song song, điểm này quan trọng. Như Windows, Linux và MacOS có trong một số trường hợp triển khai song song khác nhau tiếp xúc qua R. – Technophobe01
Tôi đang chạy nó trong windows – sbg