2011-01-13 3 views
42

인수가 미리 정의 된 몇 가지 미리 정의 된 값 중 하나 (기본값은 1 개) 또는 사용자 정의 문자 벡터 중 하나가 될 수있는 R 함수가 있다고 가정 해 보겠습니다. 마법 값 이름이나 다른 플래그에 의존하지 않고 어떻게 구현해야합니까?함수의 기본 인수와 명명 된 값

#allow use of predefined subsets or pass their own list 
bratPack<-function(members='CORE',...){ 
    if (members=='CORE') 
    members<-c('Emilio Estevez','Anthony Michael Hall','Rob Lowe','Andrew McCarthy','Demi Moore','Judd Nelson','Molly Ringwald','Ally Sheedy') 
    else if (members=='ALL') 
    members<-c('Emilio Estevez','Anthony Michael Hall','Rob Lowe','Andrew McCarthy','Demi Moore','Judd Nelson','Molly Ringwald','Ally Sheedy','James Spader','Robert Downey, Jr.','Jon Cryer', 'John Cusack', 'Kevin Bacon', 'Jami Gertz', 'Mary Stuart Masterson', 'Matthew Broderick', 'Sean Penn', 'Kiefer Sutherland') 
    ... 
} 

답변

6

나는 패키지에 어딘가에 일부 일정 dataframe을 사용하십시오 :

.mdata <- data.frame(
    CORE= c(TRUE,FALSE,TRUE), 
    OLD = c(TRUE,TRUE,FALSE), 
    ALL = c(TRUE,TRUE,TRUE), 
    row.names=c("John Doe", "Jan Janssen", "Piet Peters") 
) 

bratPack<-function(members='CORE',...){ 
    m.tmp <- try(
     match.arg(members,names(.mdata),several.ok=T), 
     silent=T) 

    if(!is(m.tmp,"try-error")) 
    members <- rownames(.mdata)[.mdata[[members]]] 

    print(members) 
} 

> bratPack('CORE') 
[1] "John Doe" "Piet Peters" 

> bratPack('Jan Janssen') 
[1] "Jan Janssen" 

> bratPack(c("John Doe","Dick Dickers")) 
[1] "John Doe"  "Dick Dickers" 
52

당신의 예에서 우리는 "CORE""ALL"를 선택할 수 있습니다. 그것들이 두 옵션이라면, 함수 정의에서 인자 'members'을 지정한다. 예컨대 :

foo <- function(x, members = c("CORE", "ALL")) { 
    ## do something 
} 

이 처음이라는 옵션으로 그 함수 정의가 "CORE" 기본값 인수 'members'에 대해 허용되는 값을 설정합니다.

@Joris가 이미 언급했듯이 함수 본문에서 사용하는 코드는 match.arg()입니다. 그러나 위와 같이 함수를 설정 했으므로 간단하게 match.arg(members}으로 사용할 수 있습니다. 우리는 옵션 세트에 포함하지 않은 문자열을 공급할 때

> foo() 
[1] "CORE" 
> foo(members = "CORE") 
[1] "CORE" 
> foo(members = "ALL") 
[1] "ALL" 
> foo(members = "3rdRate") 
Error in match.arg(members) : 'arg' should be one of “CORE”, “ALL” 

주의 행동 : 우리는 다음과 같이 사용

foo <- function(x, members = c("CORE", "ALL")) { 
    ## evaluate choices 
    members <- match.arg(members) 
    ## do something 
    print(members) 
} 

:

그래서 우리는 foo을 작성할 수 있습니다. 우리는 직관적 인 오류 메시지를 얻습니다. 왜냐하면 우리는 함수 인수에 옵션을 설정했기 때문입니다.

+0

이 글을 쓰면, "CORE"'또는''ALL "'옵션을 원하는지, 또는 두 개의 벡터 이름을 어딘가에 저장하고 싶은지 확실하지 않습니다. 내 대답은 당신의 질문에 대한 제목을 읽을 때 내가 생각했던 것입니다. –

+0

foo ("3rdRate")를 받아 들일 필요가 있습니다. 기본적으로 이러한 유형의 미리 정의 된 하위 집합을 구현하기 위해 규칙이 무엇인지 궁금합니다. –

+1

@Gavin'match - arg()'에'several.ok = T'를 설정하면'구성원 <- 'CORE'할 필요가 없습니다. 그냥 첫 번째 일치합니다. 아니면 간단히'match.arg ("CORE") 옵션을 지정하지 않고 동일합니다. 함수의 모든 옵션을 지정하지 않기로 선택했습니다. 이제 적응은 패키지 내에서 데이터 프레임 상수의 수정 만 필요로하기 때문입니다. 그렇지 않으면 새 범주를 추가하려는 경우 데이터 프레임과 함수를 모두 조정해야합니다. 내가 생각하는 디자인의 문제. 또한 try 구조를 사용하면 OP가 요청한대로 벡터를 지정할 수 있습니다. –

관련 문제