R

トップページ
Google
WWWを検索
サイト内を検索

1 可変引数のヘルプ

ヘルプを見ればだいたい説明があるわけですが、ダブルコーテーションを付け忘れないように注意しましょう。

?"..."

2 可変引数の関数の作成

名前が決まった変数を並べた後に...を書くだけです。

func_va <- function(n, ...){
    print(...elt(n)) # 可変引数のn番目を表示
    print(..1) # 可変引数の1番目を表示
    print(..2) # 可変引数の2番目を表示
    print(list(...)) # リストにして表示
}
func_va(3, "a", "b", "c")
[1] "c"
[1] "a"
[1] "b"
[[1]]
[1] "a"

[[2]]
[1] "b"

[[3]]
[1] "c"

...の後に名前が決まった変数を書いても宣言できますが、デフォルト値を設定しておかないと...の中に引数が入ってしまうので、名前がある変数に値が入りません。

func_wrong <- function(..., n) print(m)    
func_wrong("a", "b", 1)

オブジェクト ``m`` がありませんとエラーが出ます。

3 関数のラッパーをつくる

応用例として、do.callと組み合わせて関数のラッパーをつくることができます。 read.tableの引数にfileEncodingが無ければ付け加えるとすると、以下のようになります。

read.table <- function(...){
  # 可変長引数をリストに展開
  args <- list(...)
  # fileEncodingが存在しなければ、UTF-8をセット
  if(!("fileEncoding" %in% names(args))){
    args <- append(args, list("fileEncoding"="UTF-8"))
  }
  # ホンモノのread.tableを呼び出す
  # package:utils はホンモノがあるEnvironment
  do.call(get("read.table", env=as.environment("package:utils")), args)
}

なお、パッケージ内の関数などはグローバル環境を参照せずutils::read.tableを読むので、この方法では誤魔化せないです。