扬声器 | 脚本 |
| 温迪·穆尔弗里 | 您好,感谢您参加我们今天的演讲。我们很高兴与您讨论不同经验水平的脚本作者遇到的常见情况。 |
| 我们的目的是解释发生了什么,以便您拥有避免这些错误的工具和知识。那么让我们开始吧。 |
| 也许是因为默认情况下不打开,所以很容易忘记检查日志中的消息。但日志包含有关最近脚本执行的有用信息。所以让我们在 JMP 中仔细看看这个例子。 |
| 在这里我们可以看到,该脚本只是打开一个数据表并尝试进行行选择。当我们运行此脚本时, |
| 我们会收到致命错误的交互式错误消息,即您的脚本因错误而停止的情况。弹出窗口是 JMP 15 的新行为,可以在首选项中关闭。 |
| 当我们关闭该消息时,我们可以检查日志,我们会在窗口中看到相同的消息,但我们也会看到行号 |
| 找到脚本文件的名称,帮助我们找到问题区域。现在,不要仅仅依赖这些弹出窗口,因为日志中还会显示其他重要消息, |
| 而且它们不一定会导致弹出窗口。那么让我们来看另一个例子。 |
| 在这个脚本中,作者试图打开一个表,创建一个分析,并将一条消息打印到日志中。 |
| 当我们运行这个脚本时,我们立即注意到我们的分析没有生成。 |
| 再次检查日志 |
| 我们看到数据表中没有找到某一列,但是脚本继续运行并将我们的消息打印到日志中。 |
| 因此,这里最重要的一点是始终检查日志,尤其是当发生的情况不符合您的预期时。它可能只是列名拼写错误。 |
| 当前数据表的概念通常被描述为活动表。但是,是什么让表成为活动表或当前数据表,以及它为什么对您的脚本很重要? |
| 当打开、创建或以其他方式对表进行操作时,它将成为当前数据表。但是,还有其他方式可以使表在运行时成为当前表,而这些方式可能是您作为脚本作者未曾预料到的。 |
| JMP 在后台处理的任务。例如,JMP 可能需要评估公式或更新窗口。 |
| 这些后台进程可能会导致运行时激活的表与您预期的表不同。这可能会导致您的脚本失败,或者更糟的是,您甚至没有意识到 JMP 使用了错误的表。 |
| 因此,我们在这里提供了一些 |
| 使用特定于数据表的引用来编写脚本是最佳实践。这样,无论运行时哪个表处于活动状态,您都可以确保使用正确的表。 |
| 在此示例中,我们演示了如何向特定数据表发送双变量调用,以确保该表中的数据用于您的分析。 |
| 您还可以将新列作为消息发送到特定的数据表,这将确保您的新列在所需的表中创建并且不会转到当前的任何内容。 |
| 您还可以使用可选的数据表引用。在这里,我们只是演示如何使用它来引用列,稍后我们将更详细地讨论如何引用列。 |
| 您还可以在函数中使用可选的数据表引用;对于每一行和汇总是两个可用的功能。 |
| 我们还建议您避免使用数据表...使用生产脚本中的当前数据表函数分配数据表引用。在此示例中,我们将连接两个数据表,并希望分配对该表的引用 |
| 这是从连接创建的。现在,连接返回对新创建的表的引用。因此,我们希望在创建连接时分配引用,而不是分配给当前数据表。 |
| 所以在这里,我们只需在调用连接时进行分配,然后运行这个 |
| 我们可以看到,我们的新 DT 变量确实引用了所需表,并且它不受当前表的影响。 |
| 使用 JSL 变量识别列是一项常见任务,使用哪种方法取决于您的预期用途。 |
| column 函数返回对整个列的引用。它接受各种参数,例如列名称是字符串或字符串变量, |
| 索引或表示索引的数字变量。可以对其进行下标以引用特定行上的列值。 |
| 可以使用列函数的一些地方是平台调用、向列发送消息或为列分配变量引用。 |
| as column 函数返回对当前行值的引用 |
| 指定列的。它接受与列函数相同的所有参数,但重要的是要了解,在 JMP 中,除非另有管理,否则当前行始终为零。 |
| 因此,使用 as column 函数的一些好地方是公式、每行和选择位置,因为它们根据其设计在对每行进行评估时控制行。让我们看一个例子来说明我们的意思。 |
| 这里我们打开一个示例数据表。我们已将 JSL 变量分配给列名,并尝试在 select where 中使用 column 函数。 |
| 现在,当我们运行此脚本时,我们发现没有选择任何行。这是为什么呢?因为 select where 会评估每一行, |
| 使用没有任何下标的列函数将不会选择任何行。我们记得,列函数返回对列作为整体单元的引用,因此整列数据永远不会等于 14。 |
| 因此,解决方案是使用带有行下标的列函数(并且这个行下标仅表示当前行,无论在选择位置进行评估时它是什么),或者您可以使用 as column 函数来选择行。 |
| 在公式中使用 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 时, |
| 它只是用我们连接的字符串替换了整个内容,然后,记住当我们进行 eval 时, |
| 它运行该表达式。所以这里我们有 0 到 1.4。所以这是一种方法。 |
| 但有时还是会有点棘手。你应该如何真正操纵这些调度命令,因为你仍在使用调度命令,你必须知道它们是如何工作的。所以最常见的方法是完全删除这个调度命令。 |
| 因此,使用我们所谓的显示框下标。因此,在这里我将使用已删除的调度命令运行此命令,并且我们有原始轴设置。 |
| 然后我们要做的就是,在我们不知道如何写之前,只是看看它。所以我们要转到这个图标,这个轮廓框,右键单击 |
| 编辑并显示树结构。因此,这向我们展示了此轮廓框内的显示框树结构,并且在此轮廓框内,您可以看到此轴框是我们想要更改的框。因此,此轮廓框内是轴框一。 |
| 然后我们就可以开始编写脚本了。我们使用此报告函数来获取平台的报告层 OBJ1。 |
| 然后,我们根据列名用下标获取我们知道的轮廓框标题。 |
| 然后在其中我们希望...我们希望尽可能具体,这样如果在 JMP 的未来版本中发生变化,我们就不太可能遇到问题。 |
| 因此,在其中,我们需要轴框 1,这就是我们获取该轴框的方式,然后我们可以从调度命令中获取相同的信息,并将它们转换为我们发送到轴框的消息。 |
| 然后您可以在这里看到现在我们的轴设置是从零到 1.4。 |
| 因此,另一种更强大的方法是使用 XPath。它的作用相同,但可能稍微复杂一些,但也为 JMP 的未来版本提供了更大的灵活性,因为您可以使用有关框的底层数据。 |
| 我们要讨论的最后一个错误是只使用全局命名空间。因此 |
| 你可能不知道,当你创建一个符号而没有指定它去往何处时,它会进入全局命名空间。所以当你只是为个人用途模拟一些东西时,这对于快速脚本非常有用, |
| 但对于您发送给同事的脚本或者您发布的脚本或在社区上发布的插件来说,这可能不是一个好主意。 |
| 关于 JMP 中作用域和名称查找的工作原理,这里再多说一点。从此图底部开始。本地作用域可以是任意数量的作用域,其中包含函数和本地框。 |
| 因此,如果它没有找到符号,或者你没有指定它进入本地,这取决于你是在写入还是读取, |
| 然后是此处作用域,它基本上每个文件都有一个。还有全局作用域,它基本上是 JMP 会话的一个作用域。然后在右边,我们有命名空间作用域,这是你必须明确寻找的东西,才能 |
| 访问。让我们看一个例子。这只是要删除我的所有符号,因为我没有指定它们应该放在哪里,所以它会进入全局变量。所以 x 是 5。但如果其他人有一个脚本,就像,我也一样 |
| 有一个 |
| 我想要使用的变量 x。我不打算指定将其放在哪里。所以我要将其设置为 10。 |
| 但是当你回到你的脚本时,也许这是你设置的一些变量,然后你在按钮上有一些回调...按钮 |
| 依赖于该变量的操作,然后您去使用它并且变量已经发生了变化,而这可能不是您想要的。 |
| 那么我们可以通过哪些方法解决这个问题呢?最简单的方法是使用默认名称 here(1)。这意味着除非你明确告诉它去那里,否则任何东西都不会进入全局范围。让我们来看看 |
| 在这 |
| 例如。所以我们所做的就是将这个名称 default 添加到这里(1)。它可以随...一起出现,通常它位于脚本的顶部,但它实际上可以随处出现。 |
| 我要清理我的符号,并将这个变量 x 设置为 5。这样我们这里还有一些其他经文 |
| 说的是我想访问你的 x。但实际上这个 x 永远无法访问这个命名空间中的 x。所以 |
| 我们复制部分脚本并让X等于50。 |
| 因此,右侧脚本中的 X 是 50,但这对左侧脚本中的 X 没有影响。这就是将您的符号与其他脚本和应用程序轻松区分开的好方法。 |
| 另一个选项是使用自定义命名空间。这有点高级,但功能非常强大。所以我又来了……清除我的 |
| 符号,然后创建一个新的命名空间,在命名空间内设置一个变量 x 并显示它。所以它的值为五。 |
| 你还有另一个剧本。也许这是你的剧本之一,你知道 |
| myNS 是存在的。所以你可以尝试访问它,而且你做得很顺利,因为你知道它的名字。但有人在你不知情的情况下更改你的符号的可能性要小得多。所以 |
| 我可以改变这个符号,它仍然是 10,但如果我只做 X,它不会对命名空间中的 X 的结果产生任何影响。 |
| 我要把它交还给温迪,她将向我们讲述一些被忽视的资源。 |
| 温迪·穆尔弗里 | 谢谢你,Justin。有很多资源可供你了解有关 JSL 的更多信息,其中许多都是免费的。这里我们为你链接了一些更常见的查看和了解有关 JSL 的更多信息的地方。 |
| 我们还提供技术支持,您可以联系到我们,还有几本关于这个主题的书。当然,我们总是鼓励您查看我们的培训资源以及它们为您准备的计划。 |
| 请务必查看与 JMP 社区的此演示相关的论文,因为我们在那里为您介绍了一些错误,而我们今天没有时间讨论这些错误。感谢您的观看。 |