In diese Einführung in die funktionale Programmierung erstellt der Autor Hadley Wickham die folgende Funktionsfabrik:
%Vor%Er zeigt dann, wie diese Funktion verwendet werden kann, um andere Funktionen wie
zu definieren %Vor%Nun nehme ich an, ich wollte diese Funktionen gleichzeitig über die folgende Schleife erstellen:
%Vor%Dies scheint nicht zu funktionieren, da 3 für alle Einträge der Liste dem Exponenten zugewiesen wird:
%Vor%Kann mir bitte jemand helfen, zu verstehen, was mit diesem Code nicht stimmt?
Danke!
Was Sie sehen, ist eine Konsequenz von Rs Verwendung von Versprechen zur Implementierung einer Lazy-Argument-Evaluierung. Siehe Objekte versprechen .
Das Problem ist, dass in der Funktion power()
das Argument exponent
niemals ausgewertet wird, was bedeutet, dass die zugrunde liegende Verheißung niemals aufgerufen wird (zumindest nicht bis die generierte Funktion ausgewertet wird).
Sie können erzwingen, dass das Versprechen wie folgt bewertet wird:
%Vor% Ohne die exponent;
-Anweisung, um die Bewertung des Versprechens zu erzwingen, sehen wir das Problem:
Aha! Das R Changelog zeigt, dass dieses Verhalten in 3.2.0 geändert wurde:
* Funktionen höherer Ordnung wie die Funktionen Apply und Reduce () zwinge nun Argumente zu den Funktionen, die sie anwenden, um Eliminieren unerwünschter Interaktionen zwischen Lazy Evaluation und variable Erfassung in Verschlüssen. Dies löst PR # 16093.
Es ist als neues Feature klassifiziert.
Tags und Links r loops functional-programming