Ich liebe do.call
. Ich liebe es, Funktionsargumente in einer Liste zu speichern und sie dann auf eine bestimmte Funktion zu übertragen.
Zum Beispiel finde ich dieses Muster häufig, um eine Liste verschiedener Vorhersagemodelle mit einigen gemeinsamen und einigen eindeutigen Parametern für jedes Modell zu erstellen:
%Vor% global_args
enthält Argumente, die für alle Modelle gleich sind, und model_specific_args
enthält Listen mit modellspezifischen Argumenten. Ich überschlinge model_specific_args
, verknüpfe jedes Element mit global_args
und verwende dann do.call
, um die letzte Argumentliste an die Modellanpassungsfunktion zu übergeben.
Obwohl dieser Code optisch elegant ist, ist seine Leistung schrecklich: do.call
serialisiert das gesamte x-Dataset buchstäblich als Text und übergibt es dann an die Modellanpassungsfunktion. Wenn x ein paar GB Daten ist, verwendet dies eine wahnsinnige Menge an RAM und scheitert normalerweise.
Gibt es eine Möglichkeit, eine Liste von Argumenten an eine Funktion in R zu übergeben, ohne do.call
oder call
zu verwenden?
Basierend auf @ r2evans Kommentar, hier eine mögliche Lösung: quote()
die großen Objekte in der Liste der Argumente. Sie werden dann aus der globalen Umgebung gezogen, wenn do.call
die Funktion auswertet:
Das Ergebnis ist viel kleiner:
%Vor% Es wäre trotzdem nett, alle anderen Optionen nicht serialisieren zu müssen. Insbesondere der Aufruf des dritten Modells ist immer noch sehr groß: print(list_of_models[[3]]$call)