web-dev-qa-db-ja.com

関数のデフォルト引数と名前付き値

引数がいくつかの事前定義された名前付き値(そのうちの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')
  ...
}
49
Jeremy Leipzig

あなたの例から、_"CORE"_と_"ALL"_の選択肢があります。これらが2つのオプションである場合、引数_'members'_の関数定義でそれらを指定します。例えば。:

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

この関数定義は、引数_'members'_の許容値を設定します。これは、これが最初の名前付きオプションであるため、デフォルトの_"CORE"_です。

@Jorisが既に述べたように、関数本体内で使用するコードはmatch.arg()ですが、上記のように関数を設定したため、単にmatch.arg(members)に使用することができます。 。

したがって、次のようにfooと書くことができます。

_foo <- function(x, members = c("CORE", "ALL")) {
    ## evaluate choices
    members <- match.arg(members)
    ## do something
    print(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”
_

オプションのセットに含まれていない文字列を指定したときの動作に注意してください。関数の引数にオプションを設定したため、直感的なエラーメッセージが表示されます。

61
Gavin Simpson

私はパッケージ内のどこかに一定のデータフレームを使用します:

.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"
10
Joris Meys