2014-12-31 8 views
1

%dopar%%dopar% 패키지를 사용하여 doSNOW 패키지를 사용하여 foreach 패키지에서 로컬로 작업을 실행하고 있습니다 (Windows 컴퓨터에서 실행 중임) . 이전에 여러 번 해본 적이 있는데, 무의미한 foreach 루프를 내부에 %do% (즉 비 병렬) 루프를 사용하기 전까지는 제대로 작동합니다. 해결책을 간단한 for 또는 (l/s)apply와 내부 foreach 교체외부 % dopar % 및 내부 % do %가 포함 된 관련없는 중첩 된 foreach

require(foreach) 
require(doSNOW) 
cl<-makeCluster(5) 
registerDoSNOW(cl) 
for(stepi in 1:10) # normal outer for 
{ 
    foreach(rc=1:5) %dopar% # the time consuming stuff in parallel (not looking to actually retrieve any data) 
    { 
    aRandomCounter = -1 
    if(1 > 0) 
    { 
     for(batchi in 1:20) 
     { 
     anObjectIwantToCreate <- foreach(qrc = 1:100, .combine=c) %do% 
     { 
      return(runif(1)) # I know this is not efficient, it is a placeholder to reproduce the issue 
     } 
     aRandomCounter = aRandomCounter + sum(anObjectIwantToCreate > 0.5) 
     } 
    } 
    return(aRandomCounter) 
    } 
} 
stopCluster(cl) 

있다 : 내 컴퓨터에 문제를 복제하는 몇 가지 코드를 여기에

Error in { : task 1 failed - "could not find function "%do%"" 3 stop(simpleError(msg, call = expr)) 2 e$fun(obj, substitute(ex), parent.frame(), e$data) 1 foreach(rc = 1:5) %dopar% { 
    aRandomCounter = -1 
    if (1 > 0) { 
     for (batchi in 1:20) { ... 

됩니다 : 그럼 R은 나에게 (역 추적 포함) 오류를 제공합니다 . 그러나 내부에서이 작업을 수행하는 방법이 있습니까 foreach 왜 처음에는 오류가 있습니까?

+0

SO에 게시 된 코드에 'rm (list = ls())'문을 포함시키는 것은 매우 무례한 것으로 간주됩니다. 당신을 도우려고하는 누군가가 실수로 전체 세션을 지울 수 있으며 다시 작성하는 데 몇 시간이 걸릴 수 있습니다. 이것이 내가 주석 처리 한 이유입니다. 이것을 다시하지 마십시오. – jlhoward

답변

2

물론 게시자가 게시하자마자 바로 처리 할 수 ​​있습니다. (미안하지만 다른 사람이 같은 문제가있는 경우를 대비하여 남겨 둘 것입니다.) 범위를 좁히는 문제입니다. %dopar% 내에 외부 패키지를로드해야한다는 것을 알았지 만, 실현하지 못한 것은 foreach 패키지 자체를 포함한다는 것입니다.

require(foreach) 
require(doSNOW) 
cl<-makeCluster(5) 
registerDoSNOW(cl) 
for(stepi in 1:10) # normal outer for 
{ 
    foreach(rc=1:5) %dopar% # the time consuming stuff in parallel (not looking to actually retrieve any data) 
    { 
    require(foreach) ### the solution 
    aRandomCounter = -1 
    if(1 > 0) 
    { 
     for(batchi in 1:20) 
     { 
     anObjectIwantToCreate <- foreach(qrc = 1:100, .combine=c) %do% 
     { 
      return(runif(1)) 
     } 
     aRandomCounter = aRandomCounter + sum(anObjectIwantToCreate > 0.5) 
     } 
    } 
    return(aRandomCounter) 
    } 
} 
stopCluster(cl) 
+4

'foreach (rc = 1 : 5, .packages = "foreach") % dopar % ...'를 사용할 수도 있습니다. 즉,'require (...) '를 사용하지 않고'.packages = ...'인수를 사용하여 필요한 패키지를 식별 할 수 있습니다. – jlhoward