2017-03-17 7 views
0

부모 함수가 출력을 반환하도록하는 방법이 있습니까? '뭔가하고'각 기능의 시작 부분에 '무언가를 확인'하고 싶은 기능이 있다고 가정 해보십시오. 수 표가 실패하면 '다른 것'을 반환하고 싶습니다.부모 함수로 푸시 복귀

아래의 예제에서 'something something'은 로그이며 'check something'은 변수가 음수가 아니며 'something else'가 음의 무한대인지 확인하는 것을 의미합니다.

weird_log <- function(x) { 
    check(x) 
    log(x) 
} 

check <- function(x) { 
    if (x <= 0) 
    eval.parent(parse(text = 'return(-Inf)')) 
} 

이 예는

weird_log(10) # 2.302585 
weird_log(-10) # NaN 

하나의 솔루션이 검사는 다른 문제와 NULL을 발견 한 경우, 검사 기능에서 '뭔가 다른'를 반환하는 것입니다 작동하지 않습니다. 그런 다음 부모 함수에 if을 쓸 수 있습니다.

weird_log <- function(x) { 
    y <- check(x) 
    if (!is.null(y)) return(y) 
    log(x) 
} 

check <- function(x) { 
    if (x <= 0) { 
    -Inf 
    } else { 
    NULL 
    } 
} 

이 솔루션은 여전히 ​​분리 된 기능 check()에있는 대부분의 기능을 유지하지만 모든 기능을 사용할 수있는 방법이있다?


실제로 문제가되는 경우 검사 기능은 하나의 비교뿐만 아니라 여러 기능에서 사용되므로 별도로 사용해야합니다. 또한 check 함수를 반환하는 'something else'는 입력이 실패한 조건에 따라 다릅니다.


더 현실적인 예 :

weird_log <- function(input) { 
    y <- check(input) 
    if (!is.null(y)) return(y) 
    list(log = log(input$x)) 
} 

check <- function(input) { 
    if (is.null(input$x)) { 
    list(error = 'x is missing') 
    } else if (!is.numeric(input$x)) { 
    list(error = 'x is not numeric') 
    } else if (x <= 0) { 
    list(log = -Inf, warn = 'x is not positive') 
    } else { 
    NULL 
    } 
} 
+0

왜 당신은'parse (text = 'return (-Inf)')'거기에. 'eval.parent (return (-Inf))'도 똑같은 일을하지 않겠습니까? 너희들이 어디에서 배웠는지는 모르겠지만, 정말 나쁜 코드 연습이다. –

+0

좋은 점, 나는 그것을 복잡하게했다. –

답변

4

KISS :

weird_log <- function(x) { 
    if (check(x)) return(-Inf) 
    log(x) 
} 

check <- function(x) { 
    x <= 0 
} 

weird_log(10) # 2.302585 
weird_log(-10) # -Inf 

더 많이 당신이 검사가 실패 할 때 오류가 발생 할 사용 사례입니다 :

weird_log <- function(x) { 
    check(x) 
    log(x) 
} 

check <- function(x) { 
    if(x <= 0) stop("x <= 0", call. = FALSE) 
} 

weird_log(10) # 2.302585 
weird_log(-10) # Error: x <= 0 
+0

이것을 지정하지 않았지만 내부의 여러 조건에 따라 수표의 출력이 다를 수 있습니다. 따라서 수표는 단지'TRUE' /'FALSE'를 반환 할 수 없습니다. 'stop()'도 사용할 수 없기 때문에이 문제는 받아 들일 수 없습니다. –

+0

그건 내 요점을 변경하지 않습니다. return 문은 항상 반환 할 함수의 일부 여야합니다. check는 정수 값을 반환 할 수 있으며 부모 함수에서 switch를 사용할 수 있습니다. – Roland