洗,沖洗,重複是一個英語習語,可能意味著“再做一次”,或者幽默地暗示無限循環。 在腳本環境中重複一個函數或一組步驟稱為迭代或循環。迭代是一種非常重要的腳本技術。 下面是一個簡單的邏輯圖和相應的JSL代碼為了環形。

一旦新手腳本編寫者學習了基本語法為了循環,經常,他們問“我該怎麼辦”:
- 當迭代次數未知時進行迭代
- 提前停止一次循環n事件已被統計
- 在某些條件下跳過運行步驟塊,但繼續循環等。
以下是第 4 章“部分”的摘錄條件函數“,”迭代“ 的JSL Companion,JMP 腳本語言的應用,第二版介紹了基礎知識並解決了這些問題。 附件是該部分的示例腳本。 正如本書的前言中所述,“示例腳本包含的信息比我們在本書中所能包含的信息多得多。”
迭代
JSL 有幾個循環或迭代的函數。 迭代循環的基本結構包括以下內容:
- 開始或初始條件
- 測試或 while 條件
- 增量、步長或迭代序列
- 要執行的 JSL 代碼主體或塊
只要測試條件為真,JSL 的主體就會被執行。 本博客和腳本的其餘部分4_迭代.jsl提供 JMP 迭代函數的示例和說明。
對於每一行並設置每個值
對於每一行和設置每個值是數據表的特殊迭代消息,其中初始條件為 Row( ) = 1,即源數據表的第一行。 結束條件是最後一行。 增量為 1:Row( ) = Row( ) + 1。 測試條件可以被認為是一個while條件:Row() <= N Row(dt)。 前三個結構組件(初始、同時和增量)是內置的。
語法是對於每一行( ,正文) 。
求和與乘積函數
這求和和產品功能比較特殊。 在這些函數中,主要任務內置於其名稱中。 這三個參數是通常分配給變量的初始值、最終值 (i <= 6),其中隱含增量 1,第三個參數或主體包括求和或相乘的值。
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 個間隔開始,每次連續迭代都會使間隔數量加倍。 第一個示例在五次迭代後停止。
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腳本包含多個選項來執行此操作。 前面的代碼片段已經有了必要的邏輯:最後的值和積分近似值有起始值。 當絕對連續差小於收斂標準時,腳本停止。
該腳本的一種變體使用收斂準則作為測試參數中的表達式為了環形。 以下腳本使用休息( )停止。 這個例子表明,每個為了循環參數可以是代碼塊、啟動多個變量、遞增多個變量或執行其他任務。 回想一下,分號將 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時,滿足收斂標準,並且休息( )停止為了在運行增量代碼塊之前循環。 在完整腳本(此處未顯示)中,一種變體將收斂標準作為代碼測試塊中的表達式。 因此,首先運行增量塊,k=8,n=1280,然後測試塊停止為了環形。
如果沒有適當的檢查,為了和儘管循環可以無限地迭代,這稱為循環無限循環。 這通常是一個問題。 在前面的代碼中,添加的條件 k < 100 確保循環在 99 次迭代後終止,只要 k 每次遞增 1。 大多數無限循環是由於缺乏邊界檢查和破壞邊界變量引起的。 例如,如果 JSL 語句 k++ 被刪除,並且近似值發散,則為了循環將無限期地迭代或直到創建 JMP 異常。 在極少數情況下,有意的無限循環是有用的。 通常,它們用於檢查服務或對象狀態,並且包含中斷或終止語句。 它們超出了本博客[書]的範圍。
可能存在代碼主體無法或不應執行的情況。 考慮 JMP 樣本數據集半導體能力.jmp 。 P1 和 M1 列只有一個唯一值 - 控製圖或分佈圖浪費圖形空間。 應找到並忽略值全部缺失或用戶定義的列列表包含非數字列的情況。 這個場景是一個很好的例子繼續功能。 在這種情況下,通知用戶,發送帶有標題,向日誌窗口寫入註釋或向日誌文件添加文本框,然後繼續分析列表中的其餘列。 在某些情況下,您可能想跳出循環,但又想繼續執行程序。 而且,在更嚴重的情況下,您可能想要停止整個程序。 表 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 腳本語言的應用,第二版,您可以在其中找到更多使用 JMP 腳本語言的技術和示例。