Waschen , spülen , wiederholen ist eine englische Redewendung, die „do it again“ oder humorvollerweise eine Endlosschleife bedeuten könnte. Die Wiederholung einer Funktion oder einer Reihe von Schritten im Kontext der Skripterstellung wird als Iteration oder Schleife bezeichnet.Iteration ist eine sehr wichtige Skripttechnik. Unten finden Sie das Logikdiagramm und den entsprechenden JSL-Code eines einfachen Für Schleife.

Sobald ein unerfahrener Scripter die Syntax eines Basic erlernt Für Schleife, häufig fragen sie „Wie mache ich“:
- Iterieren Sie, wenn die Anzahl der Iterationen unbekannt ist
- Stoppen Sie eine Schleife einmal vorzeitig N Ereignisse wurden gezählt
- Überspringen Sie die Ausführung des Schrittblocks unter bestimmten Bedingungen, fahren Sie jedoch mit der Schleife usw. fort.
Nachfolgend finden Sie einen Auszug aus Kapitel 4, Abschnitt „ Bedingte Funktionen "," Iterieren " von JSL Companion, Anwendungen der JMP-Skriptsprache, Zweite Auflage Das stellt die Grundlagen vor und geht auf diese Fragen ein. Im Anhang finden Sie das Beispielskript dieses Abschnitts. Im Vorwort des Buchs heißt es: „Die Beispielskripte enthalten ... viel mehr Informationen, als wir in dieses Buch packen könnten.“
Iterieren
JSL verfügt über mehrere Funktionen, die eine Schleife ausführen oder iterieren. Die Grundstruktur einer Iterationsschleife umfasst Folgendes:
- Start- oder Ausgangszustand
- Test- oder While-Bedingung
- Inkrement, Schrittgröße oder Iterationssequenz
- Hauptteil oder Block des auszuführenden JSL-Codes
Der Hauptteil von JSL wird ausgeführt, solange die Testbedingung wahr ist. Der Rest dieses Blogs und Skripts 4_Iterating.jsl Bereitstellung von Beispielen und Beschreibungen von JMP-Iterationsfunktionen.
Für jede Zeile und legen Sie jeden Wert fest
Für jede Reihe Und Legen Sie jeden Wert fest sind spezielle Iterationsnachrichten für Datentabellen, bei denen die Anfangsbedingung Row( ) = 1 ist, die erste Zeile der Quelldatentabelle. Die Endbedingung ist die letzte Zeile. Das Inkrement beträgt 1: Row( ) = Row( ) + 1. Die Testbedingung kann als While-Bedingung betrachtet werden: Row( ) <= N Row(dt). Die ersten drei Strukturkomponenten (initial, while und increment) sind integriert.
Die Syntax ist Für jede Reihe ( , Körper ) .
Summations- und Produktfunktionen
Der Summe Und Produkt Funktionen sind etwas Besonderes. In diesen Funktionen ist die Hauptaufgabe im Namen integriert. Bei den drei Argumenten handelt es sich um Anfangswerte, die typischerweise einer Variablen, dem Endwert (i <= 6), zugewiesen werden, wobei ein Inkrement von 1 impliziert wird, und das dritte Argument oder der dritte Körper enthält, was summiert oder multipliziert wird.
six_evens = Summation(i=1,6,2*i); // 42 Sum of 1st 6 even integers
six_odds = Summation(i=1,6,2*i-1); // 36 Sum of 1st 6 odd integers
power3to5 = Product(i=1,5,3); // 3*3*3*3*3 = 3^5 = 243
a = 2; b = 4; d = (b - a)/10; //d is step size for 10 intervals
integration_approx = Summation( i=1, 10, d*( a + ( i-.5 )*d)^2);
// 18.66 Integral(x^2) = (x^3)/3 = 64/3 – 8/3 = 56/3
show(six_evens, six_odds, power3to5, integration_approx);
For- und While-Funktionen
Für Und Während sind traditionelle Programmieriterationsfunktionen. Typischerweise, Für wird beim Zählen verwendet und wenn die Schrittgröße konsistent ist oder die Anzahl der Iterationen berechnet werden kann. Während wird am häufigsten verwendet, wenn die Test- oder While-Bedingung eine komplexere Logik erfordert oder die Erhöhung bedingt ist. Jeden Für ( ) Codeblock kann als geschrieben werden Während ( ) Codeblock, aber das Gegenteil ist möglicherweise nicht der Fall.
Beispiel
Verwendung des vorherigen Integration_ca Erstellen Sie beispielsweise eine Iterationsschleife, um sukzessive bessere Näherungen zu erhalten. Beginnen Sie mit 10 Intervallen und jede weitere Iteration verdoppelt die Anzahl der Intervalle. Dieses erste Beispiel stoppt nach fünf Iterationen.
a = 2; b = 4; lastVal = 1000;
integration_approx = 0;
For( k = 1, k <= 5, k++,
If( k == 1,
n = 10,
n = 2 * n
);
lastVal = integration_approx; //needed to check convergence
d = (b - 2) / n;
integration_approx = Summation( i = 1, n, d * (a + (i - .5) * d) ^ 2 );
//-- show convergence
Show (k, n, d, integration_approx, integration_approx - lastVal);
); //end For
Nehmen wir an, dass ein bestimmtes Konvergenzkriterium gewünscht wird. Der 4_Iterating.jsl Das Skript enthält hierfür mehrere Optionen. Der vorherige Codeausschnitt verfügt bereits über die nötige Logik: lastVal Und Integration_ca Startwerte haben. Das Skript stoppt, wenn die absolute sukzessive Differenz kleiner als das Konvergenzkriterium ist.
Eine Variante dieses Skripts verwendet das Konvergenzkriterium als Ausdruck im Testargument des Für Schleife. Das folgende Skript verwendet a Brechen( ) stoppen. Dieses Beispiel zeigt, dass jedes der Für Schleifenargumente können ein Codeblock sein, der mehrere Variablen initiiert, mehrere Variablen erhöht oder andere Aufgaben ausführt. Denken Sie daran, dass Semikolons die JSL-Anweisungen zusammenbinden, um den auszuführenden Codeblock zu definieren.
//Uses Break() to stop looping, an early stop when convergence is met
//Note n *= 2 is equivalent to n = 2*n
a = 2; b = 4;
For( k = 1; lastVal = 1000; integration_approx = 0; n = 10 , //multiple initial values
k < 100, //test
k++; n *= 2 , //increment
lastVal = integration_approx; //body...
d = (b - a) / n;
integration_approx = Summation( i = 1, n, d * (a + (i - .5) * d) ^ 2 );
If (Abs( integration_approx - lastVal ) < 1e-5, Break() );
);
Show (k, n, d, integration_approx, integration_approx - lastVal);
Wenn Sie neu sind Für Überprüfen Sie die Werte von k und n im Protokollfenster für jede Variation dieses Skripts. Nach der ersten Schleife führt JMP den Inkrementierungscodeblock aus, bevor es den Testcodeblock ausführt. Programmierer nennen das Inkrementierung am Ende der Schleife . Für das vorherige Codefragment ist das Konvergenzkriterium erfüllt, wenn k=7 und n=640 Brechen( ) stoppt die Für Schleife, bevor der Inkrementierungsblock des Codes ausgeführt wird. Im vollständigen Skript (das hier nicht gezeigt wird) hat eine Variante das Konvergenzkriterium als Ausdruck im Testblock des Codes. Daher wird zuerst der Inkrementblock ausgeführt, k=8 und n=1280, und dann stoppt der Testblock Für Schleife.
Ohne ordnungsgemäße Kontrollen Für Und Während Schleifen können unbegrenzt wiederholt werden, was als an bezeichnet wird Endlosschleife . Dies ist normalerweise ein Problem. Im vorherigen Code stellt die hinzugefügte Bedingung k < 100 sicher, dass die Schleife nach 99 Iterationen beendet wird, solange k jedes Mal um 1 erhöht wird. Die meisten Endlosschleifen werden durch fehlende Grenzüberprüfungen und durch die Zerstörung von Randvariablen verursacht. Wenn beispielsweise die JSL-Anweisung k++ gelöscht wurde und die Näherung abweicht, wird die Für Die Schleife würde auf unbestimmte Zeit iterieren oder bis eine JMP-Ausnahme erstellt wird. Es gibt seltene Fälle, in denen eine absichtliche Endlosschleife nützlich ist. Typischerweise werden sie verwendet, um den Status eines Dienstes oder Objekts zu überprüfen, und sie enthalten eine Unterbrechungs- oder Beendigungsanweisung. Sie würden den Rahmen dieses Blogs [Buches] sprengen.
Es kann vorkommen, dass der Codekörper nicht ausgeführt werden kann oder sollte. Betrachten Sie den JMP-Beispieldatensatz Halbleiterfähigkeit.jmp . Die Spalten P1 und M1 haben nur einen eindeutigen Wert – ein Kontrolldiagramm oder ein Verteilungsdiagramm ist eine Verschwendung von grafischem Platz. Szenarien, in denen alle Werte fehlen oder in denen eine benutzerdefinierte Spaltenliste eine nicht numerische Spalte enthält, sollten gefunden und ignoriert werden. Dieses Szenario ist ein guter Fall für a Weitermachen Funktion. In diesem Fall informieren Sie den Benutzer, senden Sie eine Nachricht mit a Untertitel , schreiben Sie eine Notiz in das Protokollfenster oder fügen Sie ein Textfeld zu den Journaldateien hinzu und fahren Sie mit der Analyse der verbleibenden Spalten in der Liste fort. Es mag Fälle geben, in denen Sie aus der Schleife herauskommen, das Programm aber auch fortsetzen möchten. Und in schwerwiegenderen Fällen möchten Sie möglicherweise das gesamte Programm stoppen. Tabelle 4.1 beschreibt das Verhalten von Funktionen beim Stoppen der Iteration.
Tabelle 4.1 Funktionen zum Stoppen der Iteration
Funktion
|
Ergebnis
|
Weitermachen( )
|
Stoppt die aktuelle Iteration einer Schleife am Weitermachen -Anweisung und beginnt die Schleife am Anfang der nächsten Iteration.
|
Brechen( )
|
Stoppt die Ausführung der Schleife am Brechen -Anweisung und beginnt erneut mit der Ausführung bei der ersten Anweisung außerhalb der Schleife.
|
Wurf( )
|
Wurf( Nachricht ) schreibt eine Nachricht in das Protokollfenster und bricht die Skriptausführung ab. Diese Funktion wird häufig mit verwendet Versuchen( ) oder Wenn( ) Um das Problem zu erkennen, erstellen Sie eine sinnvolle Fehlermeldung, führen Sie Schritte zum sicheren Beenden durch und geben Sie dann eine Nachricht aus.
|
Weitermachen Und Brechen Kann im Körper des verwendet werden Für , Während , Und Für jede Reihe Funktionen. Wurf kann fast überall verwendet werden. Notiz Stoppen( ) Stoppt sofort das laufende Skript.
Zusätzliches Beispiel
Der 4_Iterating.jsl Das Skript enthält einen Codeblock, der über viele zusätzliche Funktionen verfügt und Techniken aus früheren Kapiteln verwendet ( wie zum Beispiel Offen , Sortieren , Zusammenfassung , Listen und Funktionen ) und zukünftige Kapitel. Dieses Code-Snippet ist ein Beispiel dafür Weitermachen Funktion:
//Create a custom chart for each response with a non-constant value
For( i=1, i <= nitems(cList), i++,
if( Col Std Dev( column( cList[i] ) ) == 0,
tmpStr = cList[i] || " has no variation, no charts created";
Caption( tmpStr ); //caption
VListBox( Outline Box(tmpStr) ) << journal; //journal
show( tmpStr ); //Log window
Wait( 5 ); Caption( Remove );
Continue()
//go to the bottom of the loop, skip remaining "body" of code
); // end if
cc = lot_sumry_dt << Control Chart(
Sample Label( :lot_id ),
KSigma( 3 ),
Chart Col( eval(cList[i]), Levey Jennings )
); //end control chart
report(cc)[OutlineBox(2)]<<JOURNAL></JOURNAL>
Der Inhalt dieses Blogbeitrags wurde aus einem Auszug unseres Buches zusammengefasst. JSL Companion: Anwendungen der JMP-Skriptsprache, 2. Auflage , wo Sie weitere Techniken und Beispiele für die Arbeit mit der JMP-Skriptsprache finden.