2011-01-13 11 views
42

引数がいくつかの既定の名前付き値のうちの1つ(既定値の1つ)またはカスタム文字ベクトルの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

私はどこかのパッケージでは、いくつかの定数データフレームを使用したい:

.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"の選択肢を持っています。それらが2つのオプションである場合、引数'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" 'オプションのどちらかを望んでいるのか、名前の2つのベクトルをどこかに保存したいのかどうかはわかりません。私の答えはあなたのQのタイトルを読むとき私が考えていた前者を扱っています。 –

+0

私はfoo( "3rdRate")を受け入れるために必要です。基本的には、これらのタイプの事前定義されたサブセットを実装するための規約が何であるか不思議です。 –

+1

@Gavin 'members < - 'CORE''を実行する必要はありません:' match.arg() 'に' several.ok = T'を設定した場合です。それは最初のものとちょうど一致します。あるいは単に 'match.arg(" CORE ")'オプションを指定しないでも同じです。アダプテーションはパッケージ内のデータフレーム定数の適合のみを必要とするため、関数内のすべてのオプションを指定しないことを選択しました。それ以外の場合は、新しいカテゴリを追加する場合は、データフレームと関数の両方を変更する必要があります。私が推測するデザインの問題。さらに、try構造体を使用すると、OPが要求するベクトルの指定が可能になります。 –

関連する問題