2016-09-01 7 views
1

foreach() % dopar %를 병렬 처리에 사용하는 것이 처음이며 오류 또는 경고 처리 방법에 대한 몇 가지 문제가 있습니다. 내가 foreach는() 내에서 내 사용자 지정 오류 메시지와 함께 시도()를 사용할 때R : foreach에서 오류 및 경고 메시지 표시 % dopar %

  1. 퍼센트 dopar %는 "기본"오류 메시지가 표시되지 않습니다 :이 경우

    test <- function(x) { 
        if (x==2) "a"/2 
    } 
    
    foreach(i=1:3) %dopar% { 
        tryout <- try(test(i)) 
        if (class(tryout)=="try-error") print("Error!") 
    } 
    

    을 " native "오류 메시지 : Error in "a"/2 : non-numeric argument to binary operator이 표시되지 않고 try() 오류 catch 중 Error! 만 인쇄됩니다. 그러나 foreach() % dopar %를 사용하지 않으면 두 오류 메시지가 모두 인쇄됩니다. 그렇다면 두 오류 메시지를 모두 표시하는 방법은 무엇입니까? 추가 여부 에러 여부 경고가 존재하는 경우, 상기 경우

  2. 는 경고 메시지가 동일의 foreach (는 실시 예) 상기와 같이 블록 인쇄 아래 test() 아니다 :

    test <- function(x) { 
        if (x==2) warning("Warning!") 
    } 
    

    그래서 경고를 표시하는 방법은 무엇입니까?

p.s. 나는 단순히 % dopa % 내에서 try (test (i))를 사용하면 "네이티브"오류 메시지와 경고가 인쇄되지만 실제 상황에서 내 자신의 오류 메시지를 포함하고 싶다는 것을 알았습니다. 또한 try() 대신 tryCatch()을 사용해 보았지만 문제가 해결되지 않았습니다.

감사합니다.

+1

출력을 원하는 병렬 백엔드에 알려야 할 수도 있습니다 (예 :'doSNOW'를 사용하는 경우'makeCluster'의'outfile = ""'). 자세한 내용은 [관련 질문] (http://stackoverflow.com/questions/10903787/)이 있습니다. –

+0

문제 해결을위한 중요한 방향을 지적 해 주셔서 감사합니다. 지금 doSNOW를 사용하고 있지 않지만 그 부분을 조사하고 있습니다 ... –

답변

1

나는이 문제가 오류 처리와 도파르의 오해에 관한 것이라고 생각한다. 먼저 도파르를 함수처럼 생각하십시오. 기본적으로 목록으로 객체를 반환해야합니다 (각 작업자의 모든 출력을 수집하고 foreach 함수는이를 수집하여 사용하기 위해 반환합니다, 아래 'output_list'참조).

.errorhandling = 'pass'로 설정하면 오류를 출력 개체로 반환합니다 (.combine = 'list'인 경우에만 작동 함). 오류 처리 방법은 다음과 같습니다.

.errorhandling은 작업 평가 오류를 처리하는 방법을 지정합니다. 값이 "stop"이면 오류가 발생하면 정지 기능을 통해 실행이 중지됩니다. 값이 "제거"이면 에 대한 결과는 반환되지 않거나 .combine 함수에 전달됩니다. 이 "통과"이면 작업 평가에 의해 생성 된 오류 개체는 나머지 결과에 이 포함됩니다. 결합 함수 (지정된 경우)는 오브젝트를 처리 할 수 ​​있다고 가정합니다. 기본값은 "중지"입니다.

다음은 foreach 내부에서 tryCatch를 설정하는 방법의 예입니다. 이제 오류가 output_list에 저장됩니다.

output_list = foreach(i=1:3, .errorhandling='pass') %dopar% { 
result <- tryCatch({ 
    object_that_doesnt_exist[i]}, 
    warning = function(war) { 
     return('a warning')}, 
    error = function(err) { 
     return('an error')}, 
    finally = { 
     return('other things') 
    }) # END tryCatch 

    return(result) # return your result to outputlist 
} 

output_list