ウォッシュ、リンス、繰り返すは英語の慣用句で、「もう一度やり直す」ことを暗示したり、ユーモラスに無限ループを暗示したりすることがあります。 スクリプトのコンテキストにおける関数または一連のステップの繰り返しは、反復またはループと呼ばれます。反復は非常に重要なスクリプト手法です。 以下は、単純なロジック図と対応する JSL コードです。ためにループ。

初心者のスクリプト作成者が基本的なスクリプトの構文を学習すると、ためにループすると、頻繁に「どうすればよいですか?」と尋ねられます。
- 反復回数が不明な場合に反復する
- ループを一度早めに停止するnイベントがカウントされました
- 特定の条件でステップのブロックの実行をスキップしますが、ループは継続します。
以下は第 4 章「」セクションからの抜粋です。条件付き関数"、"反復する" のJSL Companion、JMP スクリプト言語のアプリケーション、第 2 版基本を示し、これらの質問に取り組みます。 そのセクションのサンプル スクリプトを添付します。 この本の序文にあるように、「サンプル スクリプトには、この本に詰め込むことができるよりもはるかに多くの情報が含まれています。」
反復する
JSL には、ループまたは反復する関数がいくつかあります。 反復ループの基本構造には次のものが含まれます。
- 開始または初期条件
- テストまたはその間の条件
- インクリメント、ステップ サイズ、または反復シーケンス
- 実行されるJSLコードの本体またはブロック
JSL の本体は、テスト条件が true である限り実行されます。 このブログの残りの部分とスクリプト4_反復.jsl JMP 反復関数の例と説明を提供します。
各行に各値を設定
各行についてと各値を設定するデータ テーブルの特別な反復メッセージであり、初期条件は Row( ) = 1 (ソース データ テーブルの最初の行) です。 終了条件は最後の行です。 増分は 1: Row( ) = Row( ) + 1 です。 テスト条件は、while 条件 (Row( ) <= N Row(dt)) とみなすことができます。 最初の 3 つの構造コンポーネント (initial、while、increment) が組み込まれています。
構文は次のとおりです各行について ( 、本体) 。
総和関数と積関数
の合計と製品機能が特殊です。 これらの関数では、メイン タスクがその名前に組み込まれています。 3 つの引数は通常、変数に割り当てられる初期値、終了値 (i <= 6) であり、1 の増分が暗黙的に示され、3 番目の引数または本体には合計または乗算されたものが含まれます。
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 関数と While 関数
ためにとその間は従来のプログラミングの反復関数です。 通常、ためには、カウントするとき、ステップ サイズが一貫している場合、または反復数を計算できる場合に使用されます。 その間テストまたは while 条件がより複雑なロジックを必要とする場合、または増分が条件付きである場合に最も一般的に使用されます。 毎日ために( )コードのブロックは次のように記述できます。その間( )コードのブロックですが、その逆は当てはまらない可能性があります。
例
以前のものを使用する統合_おおよそたとえば、反復ループを作成して、より適切な近似値を連続的に取得します。 10 の間隔から始めて、連続する反復ごとに間隔の数が 2 倍になります。 この最初の例は、5 回の反復後に停止します。
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
特定の収束基準が必要だとします。 の4_反復.jslスクリプトには、これを行うためのいくつかのオプションが含まれています。 前のコード スニペットには、必要なロジックがすでに含まれています。最後の値と統合_おおよそ開始値があります。 絶対連続差分が収束基準より小さい場合、スクリプトは停止します。
このスクリプトの 1 つのバリエーションでは、収束基準をテスト引数の式として使用します。ためにループ。 次のスクリプトでは、壊す( )止まる。 この例では、それぞれのためにループ引数は、複数の変数を開始したり、複数の変数をインクリメントしたり、その他のタスクを実行したりするコードのブロックにすることができます。 セミコロンは JSL ステートメントを結合して、実行されるコードのブロックを定義することを思い出してください。
//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);
初めての方はためにループの場合は、このスクリプトの各バリエーションのログ ウィンドウで k と n の値を確認します。 最初のループの後、JMP はコードのテスト ブロックを実行する前に、コードのインクリメント ブロックを実行します。 プログラマーはそれをそう呼びますループの最後で増加します。 前のコード スニペットでは、k=7 および n=640 の場合、収束基準が満たされます。壊す( )を止めるためにコードのインクリメント ブロックが実行される前にループします。 完全なスクリプト (ここには示されていません) の 1 つのバリエーションには、コードのテスト ブロック内の式として収束基準があります。 したがって、インクリメント ブロックが最初に実行され (k=8 および n=1280)、次にテスト ブロックが実行を停止します。ためにループ。
きちんとしたチェックがなければ、ためにとその間ループは無限に反復できます。これを「ループ」といいます。無限ループ。 これは通常問題となります。 前のコードでは、追加された条件 k < 100 により、k が毎回 1 ずつ増加する限り、ループは 99 回の反復後に終了します。 ほとんどの無限ループは、境界チェックの欠如と境界変数の破壊によって発生します。 たとえば、JSL ステートメント k++ が削除され、近似が発散した場合、ためにループは無期限に、または JMP 例外が作成されるまで反復されます。 まれに、意図的な無限ループが役立つ場合があります。 通常、これらはサービスまたはオブジェクトの状態をチェックするために使用され、ブレークまたは終了ステートメントが含まれます。 それらはこのブログ[書籍]の範囲を超えています。
コード本体を実行できない、または実行すべきではない場合があります。 JMP サンプル データ セットを検討してください。半導体能力.jmp 。 列 P1 と M1 には一意の値が 1 つだけあります。管理図や分布図はグラフィック スペースの無駄です。 値がすべて欠落しているシナリオ、またはユーザー定義の列リストに数値以外の列が含まれているシナリオは、検出して無視する必要があります。 このシナリオは次のような場合に適しています。続く関数。 この場合、ユーザーに通知し、次のメッセージを送信します。キャプション、ログ ウィンドウにメモを書き込むか、ジャーナル ファイルにテキスト ボックスを追加して、リストの残りの列の分析を続けます。 ループから抜け出したいが、プログラムを継続したい場合もあるかもしれません。 さらに深刻な場合には、プログラム全体を停止する必要があるかもしれません。 表 4.1 は、反復を停止する関数の動作を説明しています。
表4.1反復を停止するために使用される関数
関数
|
結果
|
続く( )
|
ループの現在の反復を次の時点で停止します。続くステートメントを実行し、次の反復の開始時にループを開始します。
|
壊す( )
|
ループの実行を次の時点で停止します。壊すステートメントに戻り、ループの外側の最初のステートメントで再び実行を開始します。
|
投げる( )
|
投げる(メッセージ)メッセージをログ ウィンドウに書き込み、スクリプトの実行を中止します。 この関数はよく一緒に使用されます試す( )またもしも( )問題を発見するには、適切なエラー メッセージを作成し、安全に終了するための手順を実行して、メッセージをスローします。
|
続くと壊すの本体に使用できます。ために、その間、 と各行について機能。 投げるほぼどこでも使用できます。 ノートストップ( )実行中のスクリプトを直ちに停止します。
追加の例
の4_反復.jslスクリプトには、前の章のテクニックを使用した、多くの追加機能を備えたコード ブロックが含まれています(そのような開ける、選別、まとめ、リスト、関数)そして今後の章。 このコード スニペットは、続く関数:
//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>
このブログ投稿の内容は、書籍の抜粋から要約されたものです。 JSL Companion: JMP スクリプト言語のアプリケーション、第 2 版ここでは、JMP スクリプト言語を使用するその他のテクニックと例が見つかります。