Alternative zu.call für große Datensätze

8

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.

%Vor%

Gibt es eine Möglichkeit, eine Liste von Argumenten an eine Funktion in R zu übergeben, ohne do.call oder call zu verwenden?

    
Zach 28.01.2015, 17:03
quelle

1 Antwort

1

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:

%Vor%

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)

    
Zach 28.01.2015 18:03
quelle

Tags und Links