脚本中的迭代所以这个演示说明了如何使用 For 函数进行迭代。 到目前为止,我们已经使用带有日志的脚本编辑器来测试我们的脚本并观察结果。 但是现在我们想用调试器来看看。 所以我打开了一个脚本编辑器窗口,我将首先输入 Names Default to Here。 我会输入那个布尔值,我现在不添加空格。 我将实际上在一行上键入所有内容,然后让自动重新格式化为我清理内容。 所以我将输入一个分号,然后输入 For,开括号,a 等号分号,b 等号分号,i 等号逗号——所以我正在初始化三个变量。 然后我将输入测试,即 i 小于逗号,然后我将更新 b 和 i。 所以 b 将更新-- b+ 等于所以这是就地赋值函数,添加到函数,它将覆盖 b 的当前值并将其增加一个分号,因为我正在更新两件事,然后是 i++,即 ++ ,再次,作为添加到 i 的后增量运算符。 然后是一个逗号,然后这个简单循环的主体将是 Show 函数。 我将只显示a、逗号、b、逗号——然后我将使用运算符实际调用乘法函数——所以a乘以b。 然后我将关闭所有括号,添加分号,然后右键单击并重新格式化。 现在有一件事——嗯,这里有两件事要注意——一是JMP为我添加了一些额外的分号。 它看到我在第一个参数中将函数粘合在一起。 它看到我在第三个参数中将函数粘合在一起。 所以它添加了这些分号。 他们不疼。 在实践中,我可能会从我的脚本中删除它们,因为它们不是必需的,除非我要添加 - 将更多功能粘合在一起。 我可能做的另一件事是重新排列它,以便每个论点都有自己的路线。 但是当我们进入调试器时,我希望这与我在课程 PDF 中的内容相匹配。 因此,除了去掉那些分号外,我将保留 JMP 重新格式化它的方式。 所以有几种方法可以启动调试器。 您可以转到“编辑”菜单,并且有一个“调试脚本”选项。 您可以看到键盘快捷键是 Ctrl+Shift+R。 您可以单击“脚本编辑器”窗口中的“调试”工具栏按钮。 或者您可以右键单击并选择调试脚本。 既然这是我向您展示的最后一个,我将继续使用该方法。 所以这个调试器是 JMP 的第二个实例。 并且 JMP 的原始实例被暂时挂起。 因此,如果有任何类型的交互,例如脚本需要的对话框,调试器窗口将暂停,直到您执行该操作。 然后,一旦完成,控件就会返回到调试器。 然后,一旦您完成了调试器,您只需将其关闭即可。 您可以使用右上角的 X 或工具栏中的停止按钮。 这将使您返回到 JMP 的原始实例。 因此,首先,我将按原样运行此循环,而不放置任何断点。 这里有两个按钮。 一种是Run,另一种是Run without breakpoints。 因为我现在没有任何断点,所以它们会做同样的事情。 如果我现在想使用断点,我将使用最左侧的这个按钮。 所以我会点击那个。 它让我知道程序执行将终止,除非我重新启动,我很快就会这样做。 唯一的选择是关闭调试器。 但是在我重新启动之前,我想在下面显示脚本的面板中转到此处的 Locals 选项卡。 并且默认的命名空间是Here,这是我在网上调用的,你可以看到在运行脚本的最后,a的值为b的值为i的值为所以现在我想使用调试器在迭代的每个步骤中查看 a、b 和 i 的值。 所以我要点击那个重启按钮。 我想在行添加一个断点 为此,我单击行号的右侧。 并且您可以拥有任意数量的断点。 在这个简单的脚本中,我们真的只需要一个。 所以这意味着我们将评估 line 并设置 Here 命名空间。 然后在 for 循环中,我们将评估初始化参数。 我们将评估测试。 我们将评估 for 循环的主体,它就是 Show 函数。 然后我们将暂停,我们将在 Locals 选项卡中看到值。 让我切换回那个。 然后当我再次单击运行时,我们将更新、进行测试、运行主体并暂停,然后查看这些值。 我们将继续这样做,直到测试失败并退出循环。 所以我不想选择任何东西。 我将使用左侧的运行按钮。 同样,我不想在没有断点的情况下运行它。 所以我会运行这个。 你可以看到我们在评估之后已经停在了线上。 a、b、i 的值分别为 和。 要运行迭代的下一步,我再次单击“运行”按钮。 现在我看到 a、b 和 i 的值分别是 和。 我可以再跑一次。 我们达到了 a、b 和 i 的最终值。 我收到程序执行已终止的消息。 如果我想做其他事情,我可以重新启动。 我可以单击停止按钮。 或者我可以使用右上角的 X 关闭。 我会继续点击停止按钮。 这样就可以将控制权返回给我原来的 JMP 会话。 现在让我们假设我们已经测量了一些正在生产的化合物的固化时间。 在生产过程中,每次运行都会进行五次采样,我们确定每个样品的固化时间。 我们想查看每个样品的固化时间分布。 因此,在课程日志中,我将在部分中单击“治疗时间数据”。 我们在编写脚本时推荐的一件事是交互式地尝试事情以开始确保您尝试做的事情是可行的。 所以我想要治愈时间的直方图,所以我将做一个简单的例子来开始。 我将进入分析菜单,选择分布。 我会把 Cure Time 放在那个 Y 角色中。 再次记住,这里的角色是 Y。 我会点击确定。 所以看着这个,我想,嗯,这很棒。 这正是我想要的所有五个固化时间分布。 这就是我想要使用的平台。 我整理了一个脚本的小模板来重新创建这个报告。 让我回到主窗口并打开它。 所以这个脚本与分发平台启动,那个 Y 角色,然后以 Cure Time 作为字符串的列函数将重新创建那个报告。 所以我要根据这个模板写一个循环。 所以我将继续关闭这个 Cure Time 窗口并导航回我的脚本编辑器并清除内容,这样我就可以使用同一个窗口。 再一次,我将使用 Names Default to Here 开始我的脚本。 和以前一样,我会让 JMP 通过自动重新格式化为我清理脚本。 所以我的 for 循环将从参数 c 开始。 我将给 c 赋值。 这是我要初始化的唯一变量。 我会打一个逗号。 测试将 c 小于等于列数。 提醒一下,如果您正在使用大型数据表,则最佳实践可能是计算循环外的列数,将结果存储在变量中,然后让该变量成为您的变量'正在将 c 与。 在这种情况下,它是五列,因为我们从第二列开始。 总共有五列。 所以我不太担心每次都重做这个计数。 但最好的做法是把它拉出来。 之后我会输入一个逗号。 更新参数将只是 c 和后增量运算符,两个加号,另一个逗号,然后我将在括号中键入 Distribution,y,再次打开括号,键入 column,然后只需输入 c--计数器——在那些括号中。 我现在要箭头,以确保我的所有括号都匹配。 实际上,如果我在这里遗漏了一个右括号,并且我尝试重新格式化,我会收到一条消息,指出缺少某些内容。 所以重新格式化实际上是进行一些调试的简单方法。 我将输入分号。 然后我将继续使用重新格式化脚本按钮。 然后我将继续运行脚本。 我得到的脚本是按原样编写的,每个观察固化时间值都有一个单独的窗口,因为我正在启动分发——如果我们回到脚本编辑器窗口——我将再次启动分发平台在迭代的每一步。 但是,如果您熟悉分布,我将返回分析菜单,选择分布,然后将所有五个固化时间值放在那个 Y 角色中。 如果您熟悉分发,就会知道您可以在同一个窗口中获得所有这些。 因此,在 Journal 中,预先编写了一个脚本,用于循环使用所有列名构建 Y 角色,并在同一窗口中生成包含所有五个分布的相同报告。 所以在我开始之前,我想继续关闭所有这些报告窗口。 我将来到菜单栏并在窗口下选择关闭所有报告。 然后我会找到日记。 我想点击脚本,Cure Time Distributions。 我们将在调试器中完成这个。 因此,我将讨论在该调试器环境中的每一步发生的情况,而不是在此处的脚本编辑器窗口中。 所以我将右键单击并选择调试脚本。 同样,请记住,我们可以通过多种方式启动调试器。 我想在 line 处添加一个断点,以查看迭代的每一步会发生什么,就像我们在前面的简单示例中所做的那样。 而且我还想在 c 变量和 yCol 变量上添加一个监视。 因此,我将转到 Watch 选项卡。 我将单击绿色加号添加手表。 所以这是我可以查看脚本中特定变量的一种方式。 现在在这里,我没有太多的变量。 但是,如果您有一个包含很多变量的大脚本,并且在调试时只需要注意一些变量,那么使用 Watch 选项卡是一个很好的方法。 所以我会点击那个绿色的加号来添加手表。 我将键入变量 c 并单击确定。 然后我还想在变量 yCol 上添加一个监视,然后单击“确定”。 现在,在我开始运行它之前,我确实想谈谈整个脚本中发生的事情。 然后我们会在运行调试器的过程中看到这一点。 所以第一行是创建一个名为 yCol 的变量。 yCol 将存储分发平台的 Y 分析角色,后跟空括号,因为我的循环将通过在 Y 角色后面的括号中添加列名来构建这个表达式。 我用 Expr 引用它,因为如果您只是尝试说 yCol 并在其后用括号分配值 y,您会收到错误,因为 JMP 不会将其识别为已定义的变量。 它不承认它是一个函数。 所以我只想让这个字面值存储在 yCol 中,而不需要 JMP 尝试评估它。 所以这就是线会做的事情。 通过的行是我的 for 循环,我们从列开始我们迭代直到用完列。 再一次,在生产级脚本中,特别是如果可能有更大的数据表,我们想要计算循环外的列数,将其放入变量中。 然后 for 循环的主体只是简单地添加列 c,因此将第一轮列到存储在 yCol 中的表达式中。 并且 Insert Into 不会尝试评估它的第一个参数。 所以我不必对 yCol 变量做任何特别的事情。 它只是查看它,然后执行操作,在这种情况下,将列添加到 y 之后的括号中。 Show 函数仅用于说明目的,让我们了解每一步发生的情况。 那一块,如果我不使用调试器,它会出现在日志中。 所以我对值进行了监视,这相当于使用 Show 函数。 我们更新。 我们测试,假设 c 仍然小于或等于列数,我们将下一列插入到 yCol 中。 然后,一旦循环完成,换句话说,我们用完了列,我们就有了最后一行代码,我将从内到外讨论这个问题。 我们想使用插入函数来修改分布表达式。 我们使用 Insert 而不是 Insert Into,因为分发是 JMP 中内置的平台启动。 用户实际上不能修改分发本身。 我们可以修改使用分布的表达式。 所以我们使用插入。 然后我们将分布包装在 Expr 函数中,这样 JMP 就不会尝试评估分布。 如果我启动了——我将突出显示这一点——如果我只是运行这段代码,JMP 会说,嘿,你没有给我 Y 角色所需的参数。 所以它会给我分发平台的启动。 然后用户会将他们的列放入其中,但实际上我们不会——这会破坏我们脚本的目的,对吧? 所以这是第一个论点。 第二个参数——如果我只是将 yCol 作为第二个参数,JMP 会尝试评估它。 它会看到——在我们完成循环之后,你会看到它会是什么样子。 但它只会看到带有括号的大写 Y 和一堆列名。 这不是 JMP 知道如何处理的事情。 它不会将其识别为变量名或函数。 因此 Name Expr 使我能够查看存储的内容和 yCol 而无需尝试对其进行评估。 存储在 yCol 中的未计算表达式将在分发后放入括号中。 然后因为,一旦我这样做了,所有列中具有 Y 角色的分布仍然被引用,我们将整个东西包装在 Eval 中。 当我们回到 JMP 的常规实例并将其进一步分解时,我们可以进行处理。 所以我有我的手表。 目前,这些变量是未定义的。 所以这就是价值的体现。 让我们跑到第一个断点。 因此,在我们更新之前的第一次运行之后,c 存储了 And 现在 yCol 的值,而不是只是一个带空括号的 Y,它具有 Column Cure Time 记住从我的小模板中你可以在后台看到——我无法导航到它,因为调试器处于活动状态——但这就是为一列生成该分布的原因。 所以我将在下一次迭代中再次运行。 现在 c 等于并且 y 分析角色是启动两个固化时间列。 我再跑一次。 现在我们有三个。 我可以继续这样做。 您可以在后台的日志中看到,由于 Show 功能,这些结果正在显示。 所以我会继续这样做,直到我们退出循环。 并且所有五个固化时间列都已存储——这在 JMP 常规会话的日志中更容易看到——但现在这些都存储在 yCol 中。 所以程序执行已经终止。 我将继续并单击调试器中的停止。 因此,现在已经评估了最后一行。 我在同一个窗口中拥有所有五个直方图的固化时间分布。 现在让我们再次简要回到 Script Editor 窗口来讨论这一行,因为我认为思考我们如何从内到外构建表达式很重要。 因此,我将运行它并创建一堆错误,以确保我们清楚地知道我们为什么要按照我们的方式编写它。 所以我要注释掉预先写好的行。 回到我在调试器实例中的描述方式,我将输入单词 Insert。 而且,当您不熟悉脚本编写时,何时使用 Insert,何时使用 Insert Into,可能需要反复试验。 但同样,在这种情况下,我正在尝试——我需要启动一个具有特定分析角色或分析角色中的特定列的平台。 但我无法修改平台。 我只能修改用户创建的变量。 这些被称为 L 值。 所以让我们试试这个。 我将为该启动键入 Distribution,打开括号,关闭括号,键入逗号,然后尝试插入 yCol。 同样,我是从一个天真的角度来看的,我想要存储在 yCol 中的内容以及分发后的括号。 所以让我们看看当我运行这一行时会发生什么。 [ERROR CHIME] 我收到一个错误,名称未解析。 Y 在访问或评估所有列的 Y。 因此,如果我不理会这一点,那就意味着 JMP 试图对此进行评估。 它不能。 所以我们得到了一个错误。 所以这没有完成。 同样,当我们需要检索存储的表达式或引用的表达式而不对其进行评估时,我们使用的函数是 Name Expr。 所以我要换行——哎呀——开括号。 我将把 yCol 包装在 Name Expr 中。 你可以测试一下。 那么会发生什么。 如果我只是运行 yCol,你会看到我们刚刚得到的错误。 如果我运行 Name Expr yCol,那么您可以在日志中看到——哎呀,我正在尝试调整它的大小。 您可以在日志中看到 JMP 没有给我一个错误。 它只是返回引用的表达式。 所以现在当我尝试运行 line 哦,好吧,这一次,问题是——所以这次 JMP 没有遇到 yCol 变量的问题。 但现在它看到了没有所需价值的分发。 所以我不希望 JMP 推出这个平台。 我会取消的。 我想将分布包装在 Expr 中,因此 JMP 根本不会尝试评估它。 同样,您可以突出显示它并运行它只是为了测试它,好的,这不会导致任何问题。 现在,当我运行它时,如果我查看日志,就会发现我运行的代码行。 这是结果,具有 Y 角色的分布以及其中包含的所有列。 那么最后一部分,正如你在行中看到的那样,是包装整个事情——这只是一种方法——但是将整行包装在 Eval 函数中。 我运行它。 还有一个包含所有分布报告的分布窗口。 所以我只是想在我开发这个的过程中犯一些错误,因为我认为这有助于人们理解为什么我们以我们的方式写这些东西。 现在我要提到的另一件事是,我们通常会推荐——当我进行第一次固化时间分布时,如果你还记得的话,我去了分析、分布,我只是将固化时间放在 Y 角色中,然后单击确定。 我们通常建议您只获取 JMP 会为此编写的脚本,并将其用作编写此循环的基础。 我没有对发行版执行此操作的唯一原因是我刚刚拥有 y 分析角色的语法是较旧的语法。 如果我要转到分布旁边的红色三角形并选择将脚本保存到脚本窗口,则较新的语法会为每列单独指定它是连续分布还是名义分布。 因此,与旧语法相比,该循环中的脚本要多一点。 较旧的语法可以正常工作。 但我可能会推荐使用这种较新的语法。 这只是一个稍微复杂的循环。 但是对于大多数平台,使用 JMP 为我们编写的脚本就可以了。 我要关闭这个脚本窗口。 我们将再看一个以交互方式做某事的示例。 这一次,我将捕获该脚本。 虽然,我的循环是预先编写的。 假设我想查看所有五个固化时间值的控制图。 因此,我将通过进入我的分析菜单以交互方式开始。 在质量和流程下,我将选择控制图生成器。 我想把 Day 放在那个小组角色中,把 Cure Time 放在 Y 角色中。 然后,控制图生成器会自动为我提供固化时间的单独测量值和移动范围图,这就是我的出发点。 我将单击完成以隐藏控制面板。 然后我将转到控制图生成器旁边的红色三角形并将脚本保存到脚本窗口。 所以这个脚本编辑器窗口——这个脚本编辑器窗口。现在包含将重新创建该结果的控制图生成器。 现在只是为了使它与我预先编写的脚本相匹配,我将删除设置大小的行。 当然,您不必这样做。 我只是为了演示目的而对此进行了简化。 所以我们看到的是控制图构建器是平台启动。 然后我们有一些选择。 我们正在使用该布尔值隐藏控制面板我们没有显示功能。 然后是这个变量角色。 并且变量角色有一个子组。 对于所有固化时间值,这将是相同的。 然后它与治愈时间有一个 Y 作用,在这种情况下,治愈时间 所以我们实际上需要做的是建立三件事。 我们需要使用固化时间列建立 y 分析角色,通过添加来构建其中的变量部分——一旦我们在 Y 角色中拥有所有固化时间列——在此处添加。 然后将该变量放入控制图生成器启动中。 因此,让我们回到日志并单击 Cure Time Control Charts。 再说一遍,建立 y 分析角色是三个部分。 这就像我们所做的一样——这些线路就像我们所做的,我们在分发中看到的一样。 而且我只是对变量使用不同的命名约定。 然后我们要建立变量块。 所以我只是使用插入功能。 我有子组 Day 的变量,这对于所有固化时间值都是相同的。 但我不希望 JMP 尝试评估单词变量。 我会得到一个错误。 所以我将使用 Expr。 然后就像在该脚本中的分发一样,我正在检索存储在 yExpr 中的列列表并将其添加到变量中。 然后在这个脚本中,我实际上是在为控制图生成器构建基本模板,没有变量片段并将其存储在变量 ccExpr 中。 最后,我将添加变量行。 同样,如果我们在后台查看该代码,该变量行将被添加到 Control Chart Builder 启动中。 在这种情况下,我只是对这两个都使用了 Name Expr,因为它们是我已经定义的引用表达式。 我将该结果存储在它自己的变量中,而不是将这个插入函数包装在 eval 中。 然后我在我的脚本中使用 cc,这将评估构建的表达式。 不过,让我们继续,并将其带入调试器。 所以我将右键单击并选择调试。 我将导航到 Watch 选项卡。 我想从我的其他脚本中删除当前的手表变量,所以我只需单击按钮即可删除所有手表。 然后我将为这个脚本中的四个变量添加四个监视。 所以我会点击绿色加号。 首先,我将输入 yExpr,然后单击“确定”。 我将再次单击绿色加号,然后添加 varExpr。 我是否将其大写并不重要,但我只想与脚本中的文本保持一致。 所以我会点击确定。 我想添加 ccExpr。 单击确定。 最后,我想添加 cc,然后单击 OK。 我要设置三个断点,因为我想在这里停在三个不同的位置。 所以第一个断点将在线 这将让我看到迭代的每一步发生了什么。 下一个断点将在线所以我们将暂停以查看 varExpr 中存储的内容。 最后,我们将在线下一个断点来查看 cc 中存储的内容。 然后,一旦我们驳回这一点,就会对其进行评估。 我将使用 Step Over 按钮来执行调试器。 所以我点击那个。 线被评估,我们进入循环。 如果我们查看下面的 Watch 选项卡,您可以立即看到存储的内容和 yExpr。 然后当我再次单击 Step Over 时,我们转到第一个断点。 当我第三次单击 Step Over 时,现在您可以看到 yExpr 中包含 Column Cure Time。 我将再次单击 Step Over 以转到该断点。 再次单击。 现在我们已经将 Cure Time 插入到 Y 角色中。 所以我会继续这样做,直到我们完成 for 循环。 如果您查看此内容,您会看到所有五个固化时间列都处于 Y 角色。 现在行将定义 varExpr。 所以现在这是子组 Day 的变量,然后是所有这些列的 Y 角色。 我将再次单击 Step Over,这会将我们带到我们定义 ccExpr 的位置。 您还可以在 Watch 选项卡中看到,这只是存储 Control Chart Builder 启动,但缺少其中的重要部分。 然后线是我们把所有东西放在一起的地方。 所以我会再跳过一次。 现在,如果您想检查这一点,控制图生成器、显示控制面板等已将存储在 varExpr 中的值添加到其中。 我将再单击一次 Step Over。 程序执行终止。 我会点击停止。 现在回到我的 JMP 常规会议中,您可以看到我已经为您的治疗时间等提供了单独的测量和移动范围图表。 所以这些例子,我们正在研究使用 For 函数,使用 Expr,使用 Insert 命名 Expr 函数,然后只是看看我们如何在这些简单的上下文中使用调试器。 我将回到日记并单击删除全部保存无而不保存对我的任何脚本窗口的更改。 这将结束这个演示。