2011-03-23 2 views
3

나는 여기 뉴비 다. S4 클래스를 사용하려고합니다. 일부 설정 방법에서는 입력 값을 받아서 유효한지 테스트하고 싶습니다. 그것이 유효하다면, 나는 그것을 할당하고 싶습니다. 유효하지 않은 경우 테스트 할 수있는 경고를 생성하고 싶습니다.S4 클래스로 오류 처리

> thisFoo<-new("foo", ind = 2) 
> thisFoo 
An object of class "foo" 
Slot "ind": 
[1] 2 


> setInd(thisFoo)<-"A" 
Warning message: 
In `setInd<-`(`*tmp*`, value = "A") : Foobar 
> thisFoo 
An object of class "foo" 
Slot "ind": 
[1] 2 

하지만 할당이 실패 테스트 할 수 있도록하고 싶습니다 : 나는 문자를 할당 할 때

setClass("foo", representation(ind = "numeric")) 

setGeneric(name="setInd<-",def=function(object,value){standardGeneric("setInd<-")}) 

setReplaceMethod(f="setInd",signature="foo", 
def=function(object,value){ 
    if(is.numeric(value)){ 
    [email protected]<-value;} 
    else{ 
    warning("Foobar") 
    } 
    return(object)} 
) 

이 경고 메시지를 생성합니다 다음은 간단한 예입니다. 이 일을하는 좋은 방법은 무엇입니까? 감사.

+1

이 경우 할당은 클래스 정의를 위반하고 어쨌든 오류가 발생합니다. 시험은 필요하지 않습니다. 대안으로, 대체 메소드의 서명으로'c ("foo", "numeric")'를 사용하면,'c ("foo", "character"와 일치하는 메소드가 없기 때문에) '). Joris가 언급 한대로'tryCatch'로 오류를 잡아라. –

답변

2

할당이 실패하면 경고 대신 오류가 표시됩니다. 프로세스가 완료되었지만 예기치 않은 결과가 발생할 수 있다는 경고가 표시됩니다. 귀하의 경우, 프로세스가 중단됩니다 :

setReplaceMethod(f="setInd",signature="foo", 
def=function(object,value){ 
    if(!is.numeric(value)) 
    stop("Foobar") 

    [email protected] <- value 
    return(object)} 
) 

stop를 사용하여 당신이 tryCatch() 또는 try() 구조를 사용할 수 있습니다. 자세한 내용은 관련 도움말 페이지를 참조하십시오. 예 :

tryCatch(setInd(thisFoo)<-"A",error=function(e){print("Hello")}) 

> X <- try(setInd(thisFoo) <- "A") 
Error in `setInd<-`(`*tmp*`, value = "A") : Foobar 
> if(is(X,"try-error")) setInd(thisFoo) <- 5 
> thisFoo 
An object of class "foo" 
Slot "ind": 
[1] 5 

경고로 작업해야하는 경우 withCallingHandlers을 참조하십시오. 원래 코드 사용 :

> withCallingHandlers({setInd(thisFoo)<-"A"}, 
+  warning = function(w) {print("Hello")}) 
[1] "Hello" 
Warning message: 
In `setInd<-`(`*tmp*`, value = "A") : Foobar 

오류가있는 위의 옵션보다 사용하기가 쉽지 않습니다.

+0

감사. 그건 잘된거야. – jmmcnew