扬声器 | 成绩单 |
| 温迪·墨菲 | 您好,感谢您今天参加我们的演讲。 我们很高兴与您讨论不同经验水平的脚本作者遇到的常见场景。 |
| 我们的目的是解释正在发生的事情,以便您拥有避免这些错误的工具和知识。 那么让我们开始吧。 |
| 也许因为默认情况下它没有打开,所以很容易忘记检查日志中的消息。 但日志包含有关最近脚本执行的有用信息。 那么让我们在 JMP 中仔细看看这个示例。 |
| 在这里我们可以看到该脚本只是打开一个数据表并尝试进行行选择。 当我们运行这个脚本时, |
| 我们收到致命错误的交互式错误消息,即脚本因错误而停止的情况。 弹出窗口是 JMP 15 的新行为,可以在首选项中将其关闭。 |
| 当我们忽略该消息时,我们可以检查日志,我们从窗口中看到相同的消息,但我们也看到行号 |
| 找到脚本文件的名称,以帮助引导我们找到问题区域。 现在,不要仅仅依赖这些弹出窗口,因为其他重要消息也会出现在日志中, |
| 并且它们不一定会导致弹出窗口。 那么让我们看另一个例子。 |
| 在此脚本中,作者尝试打开一个表、创建分析并将消息打印到日志中。 |
| 当我们运行这个脚本时,我们立即注意到我们的分析没有生成。 |
| 所以我们再次检查日志 |
| 我们看到数据表中没有找到一列,但脚本继续并将我们的消息打印到日志中。 |
| 因此,这里重要的一点是始终检查日志,尤其是当发生的情况不符合您的期望时。 它可能就像拼写错误的列名一样简单。 |
| 当前数据表的概念通常被描述为活动表。 但是是什么使该表成为活动或当前数据表以及为什么它对您的脚本很重要? |
| 当打开、创建或以其他方式操作表时,它就成为当前数据表。 但是,还有其他方式可以使表在运行时变为当前状态,而脚本作者可能没有预料到。 |
| JMP 在后台处理它们的任务。 例如,JMP 可能需要计算公式或更新窗口。 |
| 正是这些后台进程可能会导致与您打算在运行时激活的表不同的表。 这可能会导致您的脚本失败,或者更糟的是,您甚至没有意识到 JMP 使用了错误的表。 |
| 所以在这里我们提供了一些 |
| 使用特定于数据表的引用来制作脚本的最佳实践。 通过这种方式,您可以确保使用正确的表,无论运行时哪个表处于活动状态。 |
| 在此示例中,我们将演示如何向特定数据表发送二元调用,以确保该表中的数据用于您的分析。 |
| 您还可以使用新列作为发送到特定数据表的消息,这将确保您的新列在所需的表中创建,并且不会转到当前的表。 |
| 您还可以使用可选的数据表引用。 在这里,我们只是演示如何使用它来引用列,我们将更详细地讨论引用列。 |
| 您还可以在函数中使用可选的数据表引用;对于每行和汇总是两个(如果可用)。 |
| 我们还建议您避免使用数据表...在生产脚本中使用当前数据表函数分配数据表引用。 在此示例中,我们连接两个数据表,并且希望分配对该表的引用 |
| 这是从连接创建的。 现在,join 返回对新创建的表的引用。 因此,我们不想分配给当前数据表,而是在创建联接时分配引用。 |
| 所以在这里,我们只需在调用 join 时进行分配,并在运行时进行分配 |
| 我们可以看到,我们的新 DT 变量确实引用了所需的表,并且它不受当前表的影响。 |
| 能够使用 JSL 变量识别列是一项常见任务,您使用哪种方法取决于您的预期用途。 |
| 列函数返回对作为整个单元的列的引用。 它接受多种参数,例如列名是字符串或者字符串变量, |
| 索引或表示索引的数值变量。 可以为其添加下标以引用特定行上的列值。 |
| 您可以使用列函数的一些地方包括平台调用、向列发送消息或向列分配变量引用。 |
| as 列函数返回对当前行上的值的引用 |
| 指定列的。 它接受与列函数相同的所有参数,但重要的是要了解,在 JMP 中,除非另有管理,否则当前行始终为零。 |
| 因此,使用 as 列函数的一些好地方是在公式中,对于每一行,并选择其中,因为它们通过设计对每一行进行评估时控制行。 让我们看一个例子来说明我们的意思。 |
| 在这里,我们打开一个示例数据表。 我们已将 JSL 变量分配给列的名称,并且尝试在 select where 中使用列函数。 |
| 现在,当我们运行此脚本时,我们发现没有选择任何行。 这是为什么? 因为选择每行的计算位置, |
| 使用不带任何下标的列函数将不会选择任何行。 我们记得列函数返回对作为一个整体单元的列的引用,因此整个数据列永远不会等于 14。 |
| 因此,解决方案是使用带有行下标的列函数(该行下标仅表示当前行,无论 select where 正在评估时是什么),或者您可以使用 as 列函数来选择行。 |
| 由于多种原因,在公式中使用 JSL 变量可能会出现问题。 JSL 变量的生命周期仅限于当前 JMP 会话,并且随着变量值的变化,公式的结果也会发生变化。 |
| 除非您查看公式编辑器中的公式,否则您可能不会意识到存在问题。 |
| 那么让我们看一下我们的示例。 在这里,我只是打开一个数据表并建立一个我想要求和的列列表。 |
| 我正在创建新的公式列,并在 sum 函数中使用 JSL 变量。 那么让我们运行一下吧。 我们可以看到我们的新列已创建并填充了数据。 但让我们看一下公式编辑器。 我们从未说过我们的 JSL 变量在 sum 函数中使用。 |
| 当我们忽略这一点并对依赖列之一进行更改时,我们还注意到我们的列公式没有自动更新。 |
| 因此,让我们保存并关闭 JMP,保存该表并关闭 JMP。 |
| 我们将重新开始。 |
| 现在请记住,该 JSL 变量的生命周期仅限于之前的 JMP 会话。 那么让我们打开桌子看看会发生什么。 |
| 我们注意到我们的变量...列公式仍然没有再次计算。 当我们查看它时,我们仍然看到 JSL 变量在那里,但现在它下面有一条红线。 我们将鼠标悬停在它上面,我们看到名称未解决的错误。 |
| 如果我们尝试重新评估公式,我们确实会收到错误消息,并且忽略错误将导致我们的所有数据都变为丢失。 那么我们该如何解决这个问题呢? |
| 当您在公式中使用变量时,您需要执行一些操作来指示 JMP 在计算公式之前将变量替换为其值。 您可以使用替代品,但今天我们将演示表达式函数。 那么让我们关闭这张表。 |
| 我们将打开该表的新副本并重新建立列列表。 |
| 现在让我们看看我们如何解决这个问题。 |
| 因此,eval 表达式函数告诉 JMP 计算并替换其中的任何变量...其参数中包含在 EXPR 函数中的变量。 |
| 然后它将返回未计算的表达式。 因此,在此代码中,JMP 将替换表达式 SAT 分数,并将其替换为我们的列列表。 |
| 因此,让我们运行这一部分,看看会发生什么。 我们确实看到 sum 函数现在有我们想要求和的列列表,而不是变量。 |
| 但它实际上并没有为我们创建专栏。 它只是返回这个表达式。 因此,为了对其进行评估,我们在 eval 表达式函数周围添加了一个 eval 函数。 |
| 这将导致 JMP 在替换发生后计算整个新列表达式。 所以本质上,电子邮件说,运行...运行 eval 表达式返回的内容,就是这个。 |
| 因此,让我们运行它,我们可以看到我们的列现已创建,并且我们拥有了预期的数据。 |
| 我们的公式不再有我们的变量,它有我们的列列表。 |
| 当我们更改依赖列中的数据时,我们的公式现在会自动更新。 |
| 所以现在我要把这个问题交给贾斯汀,让他谈谈一些需要避免的错误。 |
| 贾斯汀·奇尔顿 | 好吧,我们看到人们犯的另一个错误是当他们要设置列属性时,语法可能有点棘手。 所以在我们讨论细节之前 |
| 我们先从列属性的角度来谈谈什么是列。 所以本质上一列只是一个 |
| 该属性信息的存储库。 它不进行任何语法检查来确保 |
| 你给它的东西是正确的,这使它能够存储你想要的任何东西。 这意味着这是因为属性的使用者期望某些内容采用特定的格式,无论是 JMP 平台、使用列属性还是 JSL 应用程序。 |
| 让我们看一个简单的例子。 |
| 在这里,我们将打开一个称为列属性的表,仅供测试之用。 我们有一列称为 NPN1,一列称为 test。 此列有规格限制和访问属性,但我们想要 |
| 添加要测试的规格限制属性。 所以我们这里有我们的想法 |
| 是设置规格限制列属性的正确语法。 我们运行这个并没有给我们一个错误,但是当我们 |
| 查看该列,该列有规格限制。 |
| 你可以,但你可以看出这是不正确的。 当我们要求根据我们的规格限制进行过程能力分析时, |
| 当我们运行该程序时,我们确实得到了 NPN1 的结果,但没有得到测试列的结果。 这是因为测试列的规格限制属性中存储的内容不正确。 |
| 因此,如果您已经知道如何使用设置的属性规格限制,则可以采用一种方法, |
| 您可以将属性消息发送到 NPN1 列,我们知道该列是正确的。 因此,如果我们只运行这一行,我们就会得到正确的语法。 |
| 这实际上向我们表明,这实际上应该采用列表形式,而不是单独的参数。 因此,另一种方式,如果您不熟悉 get 属性,您可以转到您知道正确的列并复制列属性。 |
| 然后您可以将其粘贴到脚本中,您将看到添加了列属性以及几个设置属性。 所以添加列属性只是批量处理多个设置属性的一种方法。 我们可以删除它,我们可以删除额外的访问权限 |
| 财产。因此,一旦我们完成删除,我们就可以使用此设置属性通过发送运算符将其发送到我们的测试列。 所以现在当我们运行这个时, |
| 我们...它...它已经覆盖了我们的规格限制,但我们可以通过使用我们的规格限制运行相同的发行版来确认这一点。 |
| 因此,您可以在这里看到我们对两个色谱柱都有工艺能力分析。 这只是如何获取规范限制的一个示例,但这同样适用于您需要应用并获取 JSL 语法的任何列属性。 |
| 因此,我们要讨论的下一个错误是操纵调度命令。 那么什么是调度命令呢? |
| 当您执行红色小三角菜单的保存到脚本窗口或保存到剪贴板时,它会出现在您保存的脚本中。 |
| 当您添加参考线之类的内容或更改其他内容(例如关闭轮廓框)时,它就会出现。 该命令是作为 JMP 重新创建图形的内部方式而开发的 |
| 与您所做的定制。 并没有计划让用户 |
| 使用动态变量自定义它。 这意味着调度命令中的某些参数不接受 JSL 变量。 那么让我们看一个可能发生这种情况的示例。 这是一个脚本。 我们有一个 |
| 表和一个稍后将使用的字符串变量。 这本质上就是保存到脚本窗口返回的内容。 所以当我们运行这个时, |
| 我们可以看到我们的调度命令设置了测量轴的最小最大和增量 |
| 这里设置从 0 到 1.4。 现在我们可以看到调度命令依赖于 |
| 此处的轮廓框标题,但该轮廓框标题实际上是基于我们的 y 输入。 假设我们希望这是来自用户的动态输入,并且我们拥有这个变量。 我们可以使用 Y 变量。 |
| 但是我们还需要在此处使用该列的名称。 因此,当我们运行此命令时,您实际上会看到我们没有获得正确的轴设置 0.4 到 1.2,这不是......所以这意味着我们发送的内容没有被处理。 |
| 所以有几种方法可以解决这个问题。 第一个是使用 Wendy 几分钟前谈到的 eval 表达式解决方案。 所以在这里你可以看到我们有相同的 eval 表达式。 我们实际上想要包装我们在上一个示例中尝试的串联 |
| 这里。 |
| 所以 eval 表达式会说评估整个事情。 所以当我们运行 eval EXPR 时, |
| 它只是用我们的连接字符串替换整个内容,然后记住当我们进行评估时, |
| 它运行该表达式。 所以这里我们有 0 到 1.4。 这是一种方法。 |
| 但有时它仍然会变得有点棘手。 您应该如何真正操作这些调度命令,因为您仍在使用调度命令并且您必须知道它们是如何工作的。 因此,最常见的方法是完全删除此调度命令。 |
| 因此,使用我们所说的显示框下标。 因此,在这里我将使用删除的调度命令来运行它,并且我们有原始的轴设置。 |
| 然后我们要做的是,在我们真的不知道如何写这个之前,只是看看它。 所以我们要转到这个图标,这个轮廓框,右键单击 |
| 编辑和显示树结构。 所以,这向我们展示了这个大纲框内的显示框树结构,并且在这个大纲框内,您可以看到这个 axix 框是我们要更改的框。 所以在这个轮廓框中是轴框一。 |
| 那么我们就可以去写我们的脚本了。 我们使用这个报表函数来获取平台的报表层OBJ1。 |
| 然后,根据我们的列名称,我们下标以获取我们知道应该是的大纲框标题。 |
| 然后,我们希望……我们希望尽可能具体,这样,如果 JMP 的未来版本发生变化,我们就不太可能出现问题。 |
| 因此,在其中,我们需要轴盒 1,这就是我们获取该轴盒的方式,然后我们可以从调度命令中获取相同的信息,并将它们转换为我们发送到轴盒的消息。 |
| 然后您可以在这里看到现在我们的轴设置从 0 到 1.4。 |
| 因此,另一种更强大的方法是使用 XPath。 它执行相同的操作,但可能会更复杂一些,而且还可以在 JMP 的未来版本中提供更大的灵活性,因为您可以使用有关框的基础数据。 |
| 因此,我们要讨论的最后一个错误是仅使用全局名称空间。 所以 |
| 你可能不知道,但是当你创建一个符号而不指定它的去向时,它就会进入全局命名空间。 因此,当您只是为了个人使用而模拟一些东西时,这对于快速脚本非常有用, |
| 但对于您发送给同事的脚本或您在社区上发布或添加的脚本来说,这可能不是一个好主意。 |
| 关于 JMP 中范围界定和名称查找如何工作的更多详细信息。 您从该图中的底部开始。 局部作用域可以是任意数量的作用域,其中包括函数和局部框。 |
| 因此,最重要的是,如果它找不到该符号,或者您没有指定它进入本地,具体取决于您是在书写还是阅读, |
| 然后是这里的范围,基本上每个文件都有一个范围。 还有全局范围,它本质上是 JMP 会话的范围之一。 然后在右侧,我们有名称空间范围,这是您确实必须明确查找的内容,以便 |
| 使用权。让我们看一个例子。 这只会删除我的所有符号,并且由于我没有指定它们应该去哪里,因此它将进入全局变量。 所以x是5。 但是,如果其他人有一个脚本,就像,好吧,我也 |
| 有一个 |
| 我想使用的变量 x 。 我不会指定将其放在哪里。 所以我要把它设置为 10。 |
| 但是,当您回到脚本时,也许这是您设置的某个变量,然后您在按钮上进行了一些回调...按钮 |
| 依赖于该变量的操作,然后您去使用它,并且该变量已对您进行了更改,这可能是不需要的。 |
| 那么我们可以通过哪些方法来解决这个问题呢? 嗯,最简单的方法是使用默认的名称(1)。 这意味着,除非您明确告诉它去那里,否则什么都不会出现在全局范围内。 那么让我们来看看 |
| 在这 |
| 例子。所以我们所做的就是将此名称默认添加到此处(1)。 它可以与......通常它位于脚本的顶部,但它实际上可以去任何地方。 |
| 我要去,我要清理我的符号并将这个变量 x 设置为 5。 那么我们这里还有一些其他的经文 |
| 说的是我想访问你的,你的x。 但实际上,这个 x 永远无法访问此命名空间中的这个 x。 所以 |
| 让我们复制部分脚本并执行 X 等于 50。 |
| 那么右手脚本中的 X 是 50,但这对左手脚本中的 X 没有影响。 这就是,这是轻松将符号与其他脚本和应用程序分开的好方法。 |
| 另一个选项是使用自定义命名空间。 这有点高级,但功能非常强大。 所以我又来了...清除我的 |
| 符号,然后创建一个新的命名空间,在命名空间内设置变量 x 并显示它。 所以它的值为五。 |
| 你这里还有另一个脚本。 也许这是你的脚本之一,你知道 |
| myNS 存在。 所以你可以尝试访问它,而且你可以做得很好,因为你知道它的名字。 但邪恶之人在您不知情的情况下更改您的符号的可能性要小得多。 所以 |
| 我可以更改这个符号,它仍然是 10,但如果我只执行 X,它不会对命名空间中 X 的结果产生任何影响。 |
| 我将把它交给温迪,她将告诉我们一些被忽视的资源。 |
| 温迪·墨菲 | 谢谢你,贾斯汀。 您可以使用许多资源来了解有关 JSL 的更多信息,其中许多资源都是免费的。 我们在这里为您链接了一些更常见的地方,供您查看和了解有关 JSL 的更多信息。 |
| 我们还提供您可以联系的技术支持,并且还有几本有关该主题的书籍。 当然,我们始终鼓励您查看我们的培训资源以及他们为您制定的计划。 |
| 请务必查看 JMP 社区上与此演示文稿相关的论文,因为我们还为您介绍了更多错误,但我们今天没有时间讨论这些错误。 感谢您的观看。 |