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つはまったく同じことを行いません。(違いについては、回答の例を参照してください。)誰もがそれらの実際的な違いは何か、そしてどれを使用するべきかを教えてもらえますか?
list
とc
関数はどちらもこのように機能しますが、どちらもプリミティブであるため、ソースコードを簡単に調べて、それらの機能を理解することはできません。