R dili, değişken sayıda argüman alabilen işlevleri tanımlamak için şık bir özelliğe sahiptir. Örneğin, işlev data.frame
istenilen sayıda bağımsız değişkeni alır ve her bağımsız değişken, sonuçta elde edilen veri tablosundaki bir sütunun verileri olur. Örnek kullanım:
> 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
İşlevin imzası aşağıdaki gibi bir üç nokta içerir:
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
{
[FUNCTION DEFINITION HERE]
}
Benzer bir şey yapan, birden çok değer alarak ve tek bir dönüş değerinde (ve diğer bazı işlemleri yaparken) birleştirerek bir işlev yazmak istiyorum. Bunu yapmak için ...
, fonksiyonun içindeki fonksiyonun argümanlarından nasıl "paketten çıkarılacağını" anlamaya ihtiyacım var. Bunu nasıl yapacağımı bilmiyorum. İşlevi tanımında ilgili çizgi data.frame
olduğunu object <- as.list(substitute(list(...)))[-1L]
ben bir anlam yapamayan,.
Peki, üç noktayı işlevin imzasından örneğin bir listeye nasıl dönüştürebilirim?
Daha spesifik olmak gerekirse, get_list_from_ellipsis
aşağıdaki koda nasıl yazabilirim ?
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)
Düzenle
Öyle görünüyor ki bunu yapmanın iki yolu var. Onlar as.list(substitute(list(...)))[-1L]
ve list(...)
. Ancak, bu ikisi tam olarak aynı şeyi yapmaz. (Farklılıklar için cevaplardaki örneklere bakın.) Herkes bana aralarındaki pratik farkın ne olduğunu ve hangisini kullanmam gerektiğini söyleyebilir mi?
list
vec
işlevleri bu şekilde çalışır, ancak her ikisi de ilkeldir, bu yüzden nasıl çalıştıklarını anlamak için kaynak kodlarını kolayca inceleyemiyorum.