洗,冲洗,重复是一个英语习语,可能意味着“再做一次”,或者幽默地暗示无限循环。 在脚本环境中重复一个函数或一组步骤称为迭代或循环。迭代是一种非常重要的脚本技术。 下面是一个简单的逻辑图和相应的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 脚本语言的技术和示例。