Die R-Sprache verfügt über eine nützliche Funktion zum Definieren von Funktionen, die eine variable Anzahl von Argumenten annehmen können. Beispielsweise akzeptiert die Funktion data.frame
eine beliebige Anzahl von Argumenten, und jedes Argument wird zu den Daten für eine Spalte in der resultierenden Datentabelle. Anwendungsbeispiel:
> 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
Die Signatur der Funktion enthält folgende Auslassungspunkte:
function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
{
[FUNCTION DEFINITION HERE]
}
Ich möchte eine Funktion schreiben, die etwas Ähnliches tut, mehrere Werte nimmt und sie zu einem einzigen Rückgabewert zusammenfasst (sowie eine andere Verarbeitung durchführt). Dazu muss ich herausfinden, wie ...
die Argumente der Funktion innerhalb der Funktion "entpackt" werden. Ich weiß nicht, wie ich das machen soll. Die relevante Zeile in der Funktionsdefinition von data.frame
ist object <- as.list(substitute(list(...)))[-1L]
, was ich nicht verstehen kann.
Wie kann ich also die Auslassungspunkte aus der Signatur der Funktion in beispielsweise eine Liste konvertieren?
Um genauer zu sein, wie kann ich get_list_from_ellipsis
in den folgenden Code schreiben ?
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)
Bearbeiten
Es scheint zwei Möglichkeiten zu geben, dies zu tun. Sie sind as.list(substitute(list(...)))[-1L]
und list(...)
. Diese beiden machen jedoch nicht genau dasselbe. (Unterschiede finden Sie in den Beispielen in den Antworten.) Kann mir jemand sagen, was der praktische Unterschied zwischen ihnen ist und welchen ich verwenden sollte?
list
als auch diec
Funktionen auf diese Weise, aber beide sind Grundelemente, sodass ich ihren Quellcode nicht einfach überprüfen kann, um zu verstehen, wie sie funktionieren.