2013-12-20 4 views
3

for 루프를 foreach 루프로 병렬로 사용하려고합니다. for 루프의 경우 빈 행렬을 작성한 다음 for 루프에 의해 생성 된 값으로 채 웁니다. 그러나이 방법은이 채워되지 않습니다,foreach 루프의 결과를 행렬에 저장하십시오.

results<-matrix(nrow=length(classes),ncol=length(files)) 
dimnames(results)[[1]]<-classes 
dimnames(results)[[2]]<-files 

ptime<-system.time({ 
    foreach(z = 1:length(files),.packages="raster") %dopar% { 
     raster <- raster(paste(folder,files[z],sep="")) 
     data<-getValues(raster) 
     clp <- na.omit(data) 
     for(i in 1:length(classes)){ 
     results[i,z]<-length(clp[clp==classes[i]])/length(clp) 
     print(z) 
     } 
    } 
}) 

내 결과 행렬은 여전히 ​​NA의 충전되면, foreach 루프에서 작동하지 않습니다.

z는 래스터 파일이며, i는 숫자 클래스의 벡터입니다. 각 클래스 i에 대해 래스터 z의 셀 수를 구한 다음 래스터 z의 총 셀 수로 나눈 값을 비율로 구합니다.

이것을 foreach 루프의 행렬/데이터 프레임으로 저장하는 방법에 대한 조언이 있으십니까?

미리 감사드립니다.


당신은 어떻게 foreach 작품을 이해하지 않은이 previous question

답변

2

의 후속. for 루프와 같지 않습니다. 패키지 비 네트를 연구하십시오. 당신이 항상 먼저 병렬화없이 루프를 테스트해야합니다

library(foreach) 
#you need to assign the loop result 
res <- foreach(z = 1:5, .combine=c) %do% { 
    a <- z 
    a #return value for the iterations 
} 

res 
#[1] 1 2 3 4 5 


res <- foreach(z = 1:5, .combine=cbind) %:% foreach(i = 10:13, .combine=c) %do% { 
    a <- z+i 
    a 
} 
res 
#  result.1 result.2 result.3 result.4 result.5 
# [1,]  11  12  13  14  15 
# [2,]  12  13  14  15  16 
# [3,]  13  14  15  16  17 
# [4,]  14  15  16  17  18 

참고 : 다음 두 가지 간단한 예입니다. 또한 루프 내부에 print을 사용하는 것은 의미가 없습니다. 루프를 병렬로 실행할 때 인쇄 된 값이 표시되지 않습니다.

+0

귀하의 조언에 감사드립니다. 나는 크레인 문서를 읽었으나 내가 한 일을 주어진 예와 관련시킬 수는 없다. 나는 코드를 디버깅하려고하는 순간에 하나의 코어에서 내 코드를 시도하고있다. – Karen

관련 문제