R에서 "throw"에 해당


140

R에서 오류를 어떻게 "던지기"합니까? 데이터 프레임과 일부 열 이름을 가져 와서 기능을 수행하는 함수가 있습니다. 열이 존재하지 않으면 함수를 중지하고 그에 따라 모든 기능을 중지하고 싶습니다.

나는 살펴 보았다 recover및 browse및 traceback하지만, 글쎄, 그들은 가까이하지만 내가 찾던 것 같았다.


2
올바른 복구, 브라우저 및 추적은 디버깅 용이며 try / catch 시스템은 프로덕션 코드의 오류를 처리하기위한 것입니다.
— Harlan

20
질문을하는 사람들이 질문에서 여러 번 찾고있는 기능의 이름을 사용할 때 나는 그것을 좋아합니다.)
— hadley

이 질문에 대한 답변이 인기 답변보다 더 많은 이유가 있다고 생각합니다. 이 다른 질문 은 기술적으로 주제가 맞지 않지만 Stack Overflow가 유명하지 않은 익숙하지 않은 주제에 대한 매우 엄격한 요약입니다.
— Josiah Yoder

답변:


113

참조 help(tryCatch):

조건은 ' signalCondition'로 표시됩니다. 또한
' stop'및 ' warning'함수는
조건 인수 도 허용하도록 수정되었습니다 .

나중에 '참고 항목'아래에서 :

' stop'및 ' warning'신호 조건 및 ' try'은 본질적으로 ' '의 단순화 된 버전입니다 tryCatch.

그래서 당신은 아마 원합니다 stop.


24
완벽하게 작동합니다. R은 자신의 잘못이 아니기 때문에 너무 이상합니다. 우리는 잘 해석 된 언어 디자인을 다림질하기 오래 전에 설계되었습니다.
— forkandwait

5
저자에 따르면, 그것은 오래되고 좋은 Scheme의 영향을 많이 받았다. R은 'lispy'이지만 펑키 한 데이터 구조입니다. R의 "흥미로운"부분은 아마도 많은 관습이 다른 언어, 특히 문법적으로 밀접한 C 언어 패밀리와 다른 점과 관련이 있습니다. 언어가 좋은 도구를 필요로하는 개발자보다는 좋은 도구를 필요로하는 많은 통계 학자에 의해 진화 되었기 때문일 것입니다. '도트'가 단지 캐릭터라는 사실 만 받아들이려면 오랜 시간이 걸렸습니다.
— KarlP

5
여기에 인용 된 몇 가지 기본적인 예는 훌륭 할 것입니다. 여기 stackoverflow.com/a/23917007/54964
— Léo Léopold Hertz 준영

나는이 오류를 R에서 오류로 다시 던지는 방법을 검색 할 때 오류가 발생했지만 추적을 그대로 유지합니다 (오류와 함께 실행 traceback()하여 오류가 발생한 것을 확인하십시오). 사용 stop에 error의 인수 tryCatch추적까지 의지 엉망. 그러나이 finally인수는 추가 메시지를 던지고 추적을 유용하게 유지합니다. 정확한 주제는 아니지만 몇 가지 마이너스와 중재의 위협이 창 밖에서이 의견을 발동시킬만큼 중요하다고 생각합니다. :-)
— 말리 리모 커


8

Dirk가 언급 한 기본 기능을 넘어서 :

R.oo 패키지는 매우 유용 드로 () 함수를 포함한 추가 예외 처리 기능을 갖는다. 일반적인 try 또는 trycatch 함수를 사용하여 예외를 포착 할 수 있습니다.

> try(throw("Division by zero.")); print("It's ok!");
Error: [2009-10-22 10:24:07] Exception: Division by zero.
[1] "It's ok!"

자세한 내용은 여기를 참조 하십시오 : http://www1.maths.lth.se/help/R/R.oo/


8
헤헤 R이 없으면 펑키하지 않습니까? 뒤집어 줘서 죄송합니다. 흥미로운 답변에 감사드립니다. 그러나 위의 평범한 오래된 stop ()과 함께 갈 것입니다.
— forkandwait

1
더 많은 OO가 있습니다. :)
— 반복자

3
@ws. R의 펑키는 무엇입니까? plot함수를 플롯하고 try stop warn모든 것이 예상대로 작동하며 원하는 거의 모든 것이 하나의 라이너입니다.
— isomorphismes

4
종종 "한 줄짜리의 힘"은 언어에 대한 좋은 척도가 아닙니다. 우리 중 많은 사람들이 읽을 수 있고 이해하기 쉬운 코드는 줄이 적습니다. 사실, 나는 초보자이기 때문에 많은 것을 이해할 수 없으며 그에 따라 기대치를 교정하려고합니다. 그러나 다른 언어는 0에서 일을 끝내는 데 상당히 직관적입니다. R은 또한 한 줄짜리를 읽기 어려운 영리한 문화를 발전시킨 것으로 보인다. 나는 종종 영어와 같은 코드의 문화를 주장 할 것이다. 루비와 같이 종종 하나의 라이너 일 수도있다.
— Philip

6

실제로이 함수 stopifnot는 코드에서 온 전성 검사를 구현하는 데 매우 편리합니다. 여러 논리식을 취하고 거짓으로 평가되면 오류를 리턴합니다.

예 : 데이터 프레임 'df'에 열 'c'가 있는지 확인하려면 다음을 수행하십시오.

df <- data.frame(a = numeric(), b = numeric())
stopifnot(!is.null(df$c))

다음과 같은 오류가 발생합니다.

Error: !is.null(df$c) is not TRUE

파이썬의 소리 assert(...)...
— Josiah Yoder

1

열이 존재하는지 확인하고 원하는대로 할 수 있습니다. 명명 되고 열 이 존재 하는지 확인
한다고 가정하십시오 .data.framedf1col1

if(! any(grepl('^col1$',colnames(df1)))) stop("nonexistent column")

또는

if(! any(grepl('^col1$',colnames(df1)))) return(-1)

예를 들어

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.