programing

for 루프에서 오류 건너 뛰기

copyandpastes 2021. 1. 19. 08:17
반응형

for 루프에서 오류 건너 뛰기


6000 X 180 행렬 (열당 그래프 1 개)에 대해 180 개의 그래프를 생성하기 위해 for 루프를 수행하고 있는데 일부 데이터가 내 기준에 맞지 않고 오류가 발생합니다.

"Error in cut.default(x, breaks = bigbreak, include.lowest = T) 
'breaks' are not unique". 

나는 오류에 문제가 없으며 프로그램이 for 루프를 계속 실행 하고이 오류를 만든 열 목록을 제공하고 싶습니다 (아마도 열 이름을 포함하는 변수로?).

내 명령은 다음과 같습니다.

for (v in 2:180){
    mypath=file.path("C:", "file1", (paste("graph",names(mydata[columnname]), ".pdf", sep="-")))
    pdf(file=mypath)
    mytitle = paste("anything")
    myplotfunction(mydata[,columnnumber]) ## this function is defined previously in the program
    dev.off()
}

참고 : tryCatch에 대한 많은 게시물을 찾았지만 그들 중 어느 것도 나를 위해 일하지 않았습니다 (또는 적어도 기능을 올바르게 적용 할 수 없었습니다). 도움말 파일도별로 도움이되지 않았습니다.

도움을 주시면 감사하겠습니다. 감사.


이를 수행하는 한 가지 (더러운) 방법 tryCatch은 오류 처리를 위해 빈 함수 를 사용 하는 것입니다. 예를 들어 다음 코드는 오류를 발생시키고 루프를 중단합니다.

for (i in 1:10) {
    print(i)
    if (i==7) stop("Urgh, the iphone is in the blender !")
}

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
Erreur : Urgh, the iphone is in the blender !

그러나 tryCatch아무 작업도 수행하지 않는 오류 처리 함수를 사용하여 지침을로 래핑 할 수 있습니다 . 예를 들면 다음과 같습니다.

for (i in 1:10) {
  tryCatch({
    print(i)
    if (i==7) stop("Urgh, the iphone is in the blender !")
  }, error=function(e){})
}

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10

그러나 코드를 계속 실행하는 동안 문제가 발생했는지 확인하려면 오류 메시지를 인쇄해야한다고 생각합니다.

for (i in 1:10) {
  tryCatch({
    print(i)
    if (i==7) stop("Urgh, the iphone is in the blender !")
  }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})
}

[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
ERROR : Urgh, the iphone is in the blender ! 
[1] 8
[1] 9
[1] 10

편집 : 따라서 tryCatch귀하의 경우 에 적용하려면 다음과 같습니다.

for (v in 2:180){
    tryCatch({
        mypath=file.path("C:", "file1", (paste("graph",names(mydata[columnname]), ".pdf", sep="-")))
        pdf(file=mypath)
        mytitle = paste("anything")
        myplotfunction(mydata[,columnnumber]) ## this function is defined previously in the program
        dev.off()
    }, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})
}

오류를 포착하는 대신 myplotfunction(), 오류가 발생하면 (즉, 중단이 고유 한 경우) 함수 내부 또는 이전에 먼저 테스트하고 표시되지 않는 경우에만 플로팅하는 것이 가능하지 않을까요?!

참조 URL : https://stackoverflow.com/questions/14748557/skipping-error-in-for-loop

반응형