2012-05-02 3 views
4

매개 변수를 확인하는 일반적인 방법은 함수에서 정의 된 것입니다. 나는이 세 가지 아이디어를 생각해 냈습니다. 어느 것이 올바른 방법인가?R 매개 변수 검사가 정의되어 있습니다.

불행히도, 세 번째는 작동하지 않습니다. substitute() 함수에서 다르게 작동하고 그것을 제대로 사용하는 방법을 알아낼 수 없습니다.

file.names <- list(
        cov.value <- "cov.rds", 
        plot.name <- "plot.pdf" 
) 

test1 <- function(file.names){ 
    is.save <- !missing(file.names) 
} 

test2 <- function(file.names = NULL) { 
    is.save <- !is.null(file.names) 
} 

test3 <- function(file.names = NULL) { 
    is.save <- exists(as.character(substitute(file.names))) 
} 
+1

많은 장소에서 처음 두 가지를 모두 사용했습니다. 세 번째 시도는 권하지 않습니다. – joran

+0

[이 질문에 대한 답변] (http://stackoverflow.com/q/9877271/1281189)을 확인하십시오. 나는 [이 답변] (http://stackoverflow.com/a/9883471/1281189)에 부분적입니다. – BenBarnes

+0

@BenBarnes, 링크에 감사드립니다. 매개 변수가 ... 인수에 정의되어 있는지 테스트하기 위해 링크의 대답이이 질문에 사용되었습니다. – microbe

답변

2

개인적으로 두 번째 방법은 기본값을 사용하면 훨씬 편리하다고 생각합니다. &. (그리고 세 번째 방법은 정말 나쁜 것입니다)

... 특히 인자를 전달해야하는 래퍼 함수를 ​​작성하는 경우. "누락 된"값을 전달하는 방법은 분명하지 않습니다!

wraptest1 <- function(n) { 
    file.names <- if (n > 0) sample(LETTERS, n) 
     else alist(a=)[[1]] # Hacky way of assigning 'missing'-value 
    print(test1(file.names)) 
} 
wraptest1(2) # TRUE 
wraptest1(0) # FALSE 

wraptest2 <- function(n) { 
    file.names <- if (n > 0) sample(LETTERS, n) 
     else NULL # Much easier to read & understand 
    print(test2(file.names)) 
} 
wraptest2(2) # TRUE 
wraptest2(0) # FALSE 

는 [부여, 누락 된 값을 전달 해결할 수있는 다른 방법이 있습니다,하지만 포인트는 기본값을 사용하면 ... 훨씬 쉽다이다]

일부 디폴트 값은 NULL 고려해야합니다 NA, numeric(0), ''

+0

명시 적 기본값 사용에 동의합니다. – microbe

3

일반적으로 숙련 된 코더의 코드를 살펴 보는 것이 좋습니다. R 자체에는 R 소스에 많은 예제가 있습니다.

첫 번째 예제와 두 번째 예제가 모두 사용되는 것을 보았습니다. 첫 번째 것은 꽤 관용적입니다. 나는 개인적으로 습관의 힘으로 더 자주 두 번째를 사용한다. 세 번째는 내가 너무 애매한 찾으십시오.

+0

의견을 보내 주셔서 감사합니다. 나는 당신이 그것을 사용하는 습관을 가지고 있기 때문에 두 번째가 더 전통적이라고 생각한다. :) 나는 두 번째에 충실하려고 노력할 것이고, 그것이 나에게 맞는지 알기 위해 시험해 볼 것이다. – microbe

관련 문제