R言語: 関数で可変長引数を扱う

1 min read読了の目安(約1400字

R言語の関数で可変長引数を扱う

R言語の関数で、可変長引数を扱う方法です。 備忘録として。

Ellipses ( ... )

Rのドキュメントをみていると、関数の引数のところに、3連のドット(ピリオド)が書いてあるものがあります。

例) https://stat.ethz.ch/R-manual/R-patched/library/graphics/html/plot.default.html

これは可変長引数が扱える関数です。この ... がついた関数は、明示されている以上の数の引数をとることができます。

この記号、名前は、ellipsis (英語で省略記法の意味だそうです。)というそうです。 複数形になって、ellipses と書かれていたりします。

後述のように、そのまま、... を他の関数に渡したり、list() 関数を適用してlistオブジェクトに変換することで、可変長引数が扱いやすくなります。

使用例

代表的には以下の2つでしょうか。1. 可変長引数を取る他の関数にそのまま渡したい。 2.自作関数でユーザの渡した引数をチェックしたい。

1. 可変長引数を取る他の関数にそのまま渡したい

以下の例では、plot_wrapper() に渡された引数をすべて、plot()関数に渡します。 仮引数の ... という記法が、そのまま、次の関数呼び出しにも使えて、わかりやすいですね。

plot_wrapper = function( ... ){
  cat("call plot() \n")
  plot( ... )
}

plot_wrapper( x = c(1,2,3), y = c(1,8,27) )

2. 自作関数でユーザの渡した引数をチェックしたい

まず、ポイントとして、仮引数の、 ... を、扱いやすいような形に変換するには、list() を使えばよいそうです。

以下の例では、arglist に、list( x = c(1,2,3), y = c(1,8,27) , main = "x vs y" ) が渡ることになるので、names() を適用することで、引数の名前が取り出せて(本例では、c("x", "y", "main") )、ここに、"main"が含まれるか判定して、含まれれば、それをそのまま使う。含まれなければ、plot()を呼ぶときに、 main = "scatter plot" 引数を追加する、というプログラムになります。

plot_wrapper = function( ... ){
  arglist = list(...)
  if( "main" %in% names(arglist)  ) {
    plot( ... ) 
  } else {
    plot( ... , main = "scatter plot" )
  }
}

# plot_wrapper( x = c(1,2,3), y = c(1,8,27) )
plot_wrapper( x = c(1,2,3), y = c(1,8,27) , main = "x vs y")

補足

この ellipses は内部的にはどういう風に扱われているのかなと漠然と思っていたのですが、どうも、DOTSXP でよいようです。