R 言語には、可変数の引数を取ることができる関数を定義するための便利な機能があります。たとえば、関数data.frame
は任意の数の引数を取り、各引数は結果のデータ テーブルの列のデータになります。使用例:
> data.frame(letters=c("a", "b", "c"), numbers=c(1,2,3), notes=c("do", "re", "mi"))
letters numbers notes
1 a 1 do
2 b 2 re
3 c 3 mi
関数のシグネチャには、次のように省略記号が含まれます。
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
{
[FUNCTION DEFINITION HERE]
}
複数の値を取り、それらを単一の戻り値に統合する(および他の処理を行う)、同様のことを行う関数を作成したいと思います。これを行うには...
、関数内で関数の引数から を「アンパック」する方法を理解する必要があります。これを行う方法がわかりません。の関数定義の関連する行data.frame
はobject <- as.list(substitute(list(...)))[-1L]
、私には意味がわかりません。
では、関数のシグネチャの省略記号をたとえばリストに変換するにはどうすればよいでしょうか?
より具体的にget_list_from_ellipsis
は、以下のコードにどのように記述すればよいでしょうか?
my_ellipsis_function(...) {
input_list <- get_list_from_ellipsis(...)
output_list <- lapply(X=input_list, FUN=do_something_interesting)
return(output_list)
}
my_ellipsis_function(a=1:10,b=11:20,c=21:30)
編集
これを行うには2つの方法があるようです。as.list(substitute(list(...)))[-1L]
とですlist(...)
。ただし、これら 2 つはまったく同じことを行うわけではありません。(違いについては、回答の例を参照してください。)それらの実際の違いは何か、どちらを使用すべきか教えてもらえますか?