2016-08-04 11 views
2

분명히 시도하고 trycatch이 문제가 작동하지 않습니다! 다른 대안?

내가 실제로 코드R 오류 루프 계속

result = 0 
for(i in 1:10){ 
    result = result + i 
    log("a") #I do not care about this error 
    result = result + i 
} 

이 결과를 제공해야합니다을 변경하지 않고 다음 예제 코드를 작동하게하기 위해 노력하고있어 = 110

내가 실제로 루프 내부의 부분을 복사하여 수동으로 할 경우 카운터를 늘리면 완벽하게 작동합니다.

result = 0 

#iteration 1 
i = 1 
result = result + i 
log("a") 
result = result + i 

#iteration 2 
i = i+1 
result = result + i 
log("a") 
result = result + i 

#iteration 3 
i = i+1 
result = result + i 
log("a") 
result = result + i 

#etc. 

그러나 실제 코드에는 약 1000 개의 행이 있으며 수 백 번 반복해야합니다.

그래서 내가 몇 가지 옵션

options(on.error.just.continue.the.next.line) = TRUE 

을하고 싶습니다 내가 읽은 대한 시도/tryCatch하지만 난 그냥 실행 코드를하려면 제대로 내가

답변

3

생각을 이해하지 않는다 대신 try를 사용할 수 있습니다

result <- 0 
for(i in 1:10){ 
    result = result + i 
    try({log("a")}) #I do not care about this error 
    result = result + i 
} 

오류 로그 ("A")에 : 숫자가 아닌 인수를 수학 함수에 로그 오류 ("a") : 수학 함수에 숫자가 아닌 인수
로그 ("a") 오류 : 수학 함수에 숫자가 아닌 인수
로그 ("a") 오류 : 숫자가 아닌 숫자 로그의 수학 함수
오류 ("A")에 인수 : 로그 ("A")에서 수학 함수에 숫자가 아닌 인수가
오류 : 수학 함수에 숫자가 아닌 인수 로그에
오류 ("A") : 수학 함수에 숫자가 아닌 인수
수학 함수의 숫자가 아닌 인수
로그 오류 ("a") : 수학 함수 0이 아닌 숫자 인수 로그 ("A")에서 오류 : 당신이 걱정된다면 수학 함수에 숫자가 아닌 인수

result 
[1] 110 

메시지를 해제하려면

try({log("a")}, silent=TRUE) 

를 사용 큰 코드 블록 인 경우 다음과 같이 { }에 넣을 수 있습니다.

result <- 0 
for(i in 1:10){ 
    try({    # start code block 
    result = result + i 
    log("a")    # I do not care about this error 
    result = result + i 
    }, silent=TRUE)  # end of try function 
} 

result 
[1] 55 

여기서 첫 번째 결과 할당은 for 루프에서 완료됩니다. 그런 다음 두 번째 할당 인 나머지 코드 블록의 실행을 "삭제"하는 오류가 발생합니다. 그러나 루프 실행은 완료를 통해 계속 허용됩니다.

+0

그리고 무엇을?모든 코드 행에 try()를 추가하고 싶지 않습니다. – Ivo

+0

일부 상황에서는 문제가되지 않습니다. 내가 편집 할게. – lmo

+0

좋아, 내가 찾던 해결책이 아니기 때문에, 그것을 닦아 낼 방법이 없다는 것이 이상하다는 것을 알았다. 특히 수동으로 선택하고 블록을 실행할 때 무시합니다. 하지만 고마워요 – Ivo

4
당신은 시도의 catch 블록을 사용하여 시도 할 수 있습니다

: 코드의 약> 100 부를 가능성이 잘못 갈 수 있다면

result = 0 
for (i in 1:10) { 
    result = result + i 
    tryCatch({ 
     log("a") #I do not care about this error 
    }, warning = function(w) { 
     # comment out the next print statement for a silent warning 
     print("warning") 
    }, error = function(e) { 
     # comment out the next print statement for a silent error 
     print("error") 
    }, finally = { 
     # cleanup 
    } 
    result = result + i 
} 
+0

코드의 약 100 분의 1이 잘못 될 가능성이 있다면 어떨까요? 나는 코드의 모든 줄 주위에 try()를 추가하고 싶지 않다. – Ivo

+2

여러 곳에서'try'를 사용하는 것으로 잘못된 것이 보이지 않는다. 이것은 Java, C++ 및 C#과 같은 객체 지향 언어로 일상적으로 수행됩니다. –

+0

시도에서 약 100 줄의 줄 바꿈했습니다 있지만 내 코드는 여전히 작동하지 않습니다. 말 그대로 try()에 모든 코드 줄을 포함해야합니까? 이것은 나에게 극도로 추악한 프로그래밍으로 보입니다. – Ivo