R에서 "throw"에 해당


140

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

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


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()하여 오류가 발생한 것을 확인하십시오). 사용 stoperror의 인수 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.