Bahasa R memiliki fitur bagus untuk mendefinisikan fungsi yang dapat mengambil sejumlah variabel argumen. Misalnya, fungsi data.frame
mengambil sejumlah argumen, dan setiap argumen menjadi data untuk kolom dalam tabel data yang dihasilkan. Contoh penggunaan:
> 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
Tanda tangan fungsi mencakup elipsis, seperti ini:
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
{
[FUNCTION DEFINITION HERE]
}
Saya ingin menulis fungsi yang melakukan sesuatu yang serupa, mengambil beberapa nilai dan mengkonsolidasikannya ke dalam nilai pengembalian tunggal (serta melakukan beberapa pemrosesan lainnya). Untuk melakukan ini, saya perlu mencari cara untuk "membongkar" ...
dari argumen fungsi di dalam fungsi. Saya tidak tahu bagaimana melakukan ini. Baris yang relevan dalam definisi fungsi data.frame
adalah object <- as.list(substitute(list(...)))[-1L]
, yang saya tidak bisa memahaminya.
Jadi bagaimana saya bisa mengubah elipsis dari tanda tangan fungsi menjadi, misalnya, daftar?
Untuk lebih spesifik, bagaimana saya bisa menulis get_list_from_ellipsis
dalam kode di bawah ini?
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)
Edit
Tampaknya ada dua cara yang memungkinkan untuk melakukan ini. Mereka as.list(substitute(list(...)))[-1L]
dan list(...)
. Namun, keduanya tidak melakukan hal yang persis sama. (Untuk perbedaan, lihat contoh dalam jawaban.) Adakah yang bisa memberi tahu saya apa perbedaan praktis di antara mereka, dan mana yang harus saya gunakan?
list
danc
fungsinya bekerja dengan cara ini, tetapi keduanya primitif, jadi saya tidak dapat dengan mudah memeriksa kode sumber mereka untuk memahami cara kerjanya.