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.rbind.data.frame
benutze diesen Weg.list(...)
ausreicht, warum verwenden R-Builds stattdessendata.frame
die längere Formas.list(substitute(list(...)))[-1L]
?data.frame
, weiß ich nicht , die Antwort auf diese Frage (was gesagt, ich bin sicher , dass es ist ein guter Grund dafür). Ich verwendelist()
zu diesem Zweck in meinen eigenen Paketen und habe noch kein Problem damit.Nur um die Antworten von Shane und Dirk zu ergänzen: Es ist interessant zu vergleichen
mit
So wie es aussieht, scheint jede Version für Ihre Zwecke geeignet zu sein
my_ellipsis_function
, obwohl die erste deutlich einfacher ist.quelle
Du hast schon die halbe Antwort gegeben. Erwägen
Dies nahm also zwei Argumente
a
undb
aus dem Aufruf und konvertierte es in eine Liste. War es nicht das, wonach du gefragt hast?quelle
[[1]]
. Außerdem würde ich gerne wissen, wie die magische Beschwörungas.list(substitute(list(...)))
funktioniert.list(...)
erstellt einlist
Objekt basierend auf den Argumenten. Dannsubstitute()
erstellt der Parse - Baum für den unevaluierten Ausdruck; Siehe die Hilfe zu dieser Funktion. Sowie ein guter fortgeschrittener Text zu R (oder S). Das ist kein triviales Zeug.[[-1L]]
Teil (aus meiner Frage)? Sollte es nicht sein[[1]]
?print(c(1:3)[-1])
werden nur 2 und 3 gedruckt. DasL
ist eine neumodische Art und Weise es als eine ganze Zahl endet , um sicherzustellen, das viel in den R - Quellen durchgeführt wird.[[1]]
und dem$a
Index ließ mich denken, dass verschachtelte Listen beteiligt waren. Aber jetzt sehe ich, dass Sie tatsächlich die Liste erhalten, die ich möchte, aber mit einem zusätzlichen Element vorne. Dann[-1L]
macht das also Sinn. Woher kommt dieses zusätzliche erste Element überhaupt? Und gibt es einen Grund, warum ich dies anstelle von einfach verwenden solltelist(...)
?Dies funktioniert wie erwartet. Das Folgende ist eine interaktive Sitzung:
Gleich, außer mit einem Standardargument:
Wie Sie sehen, können Sie damit 'zusätzliche' Argumente an eine Funktion in Ihrer Funktion übergeben, wenn die Standardeinstellungen in einem bestimmten Fall nicht Ihren Wünschen entsprechen.
quelle