扬声器
|
成绩单
|
| 乔丹希勒 |
大家好。 我是乔丹·希勒(Jordan Hiller),这次演讲是“窃取代码”! 从增强日志中获得的脚本的三个升级。 |
| |
这就是本次演讲的灵感来源。 这是艾比·霍夫曼(Abbie Hoffman)的书,她是一位煽动者和活动家。 是的,他给他的书起了个名字,《偷这本书》,这是一个很棒的书名。 不确定用这个名字来命名你的书是否是一个很好的商业计划,但无论如何,它非常吸引人。 |
| |
那么为什么要窃取这段代码呢? JMP 希望你窃取代码。 这个想法是您在 JMP 中点击并进行分析, |
| |
并且您的点击背后的代码将被保存。 它保存在增强日志中,您可以获取并重复使用它。 |
| |
这大约是您制作脚本的 90%。 你将抓住它并重复使用它,这样你就可以 |
| |
自动执行常见任务,只需单击一个按钮即可完成,而不是一系列点击。 这就是这里的全部目标,你要保存 |
| |
增强日志中的脚本,这就是骨头,即生产脚本的骨架。 |
| |
剩下大约 10% 的内容需要您自己编写,这就是我们本次演讲的目标。 我们将讨论一些将制作脚本结合在一起的结缔组织。 |
| |
所以在这次演讲中,我将重点关注你,你知道,而不是关注语法的实质内容, |
| |
更多关于大局的内容,这符合我认为学习 JSL 编程的好方法。 最好采用现有代码并通过示例进行学习。 使用该代码。 |
| |
找到可以完成您想做的事情的片段。 您可以在 JMP 用户社区或脚本指南中找到它。 |
| |
只需复制它并进行调整以供您使用。 您不必了解语法的所有复杂性。 那样你就会走得很远。 随着经验的积累,语法的学习也会随之而来。 |
| |
因此,我们将讨论三个案例研究,说明您可以通过增强日志来增强代码,但首先让我们回顾一下 JSL。 也许这是对你们中的一些人的一些 JSL 基础知识的介绍。 |
| |
因此,如果您刚开始接触 JSL,那么了解 JSL 的重要一点是一切都是对象。 你所拥有的一切 |
| |
想要做的事情是一个对象,因此包括数据表和数据表中的列,以及平台,如分发平台、图形生成器、Fit Y by X, |
| |
以及来自这些平台的报告。 因此,当您拥有对象时,对它们进行操作的方式就是向它们发送消息。 所以对象接收消息。 这是我从增强日志中复制的一个非常简单的示例。 |
| |
打开示例数据目录中的Big Class数据表,运行一个简单的分布分析,对吧。 这就是代码的样子,只是从日志中复制的。 |
| |
现在。 |
| |
我们要做的,第一件事就是给数据表命名。 给它一个名字,为此我从第五行获取了代码并对其进行了增强。 我 |
| |
在其余部分之前,在语句的 open 部分之前添加这个 bctable= ,好吧。 其作用是,当我们打开该数据表时,我们创建这个名称 bctable。 你知道,我选择了 bctable,你会在文档中看到 dt。 使用你想要的,这是你分配的。 |
| |
因此,让我们通过突出显示它并单击运行按钮来运行它,打开 Big Class 并同时指定名称 bctable。 现在这样做的好处,为什么它很重要,因为现在我有了这个 |
| |
处理。这是我稍后可以在代码中使用的一个钩子,bctable。 每当我说 bctable 时,我指的是 Big Class。 |
| |
所以 |
| |
这是下一行,但是分发命令,我也修改了它。 你知道,在之前的日志中,这是一个赤裸裸的分发命令。 它没有... |
| |
它不是指向数据表。 当您以这种方式运行它时,JMP 将仅在具有焦点的数据表上运行它, |
| |
当前的数据表,恰好是一个大类,因为你就在那之前打开了它,好吧。 但明确表达总是好的。 明确说明要操作哪个数据表是个好主意,因此我们将以这种方式运行它。 |
| |
bctable,然后是双箭头,然后是分发命令。 这就是我们添加的内容,带有双箭头的 bctable。 |
| |
这是发送消息的语法。 因此,我们将右侧的分发消息发送到左侧的数据表,即 bctable 的名称。 当我将鼠标悬停在 bctable 上时,您可以看到这是 Big Class。 所以运行整个事情, |
| |
我们得到分布报告 |
| |
我们想要的。 |
| |
现在……我们可以更进一步,而且通常我们需要这样做。 我们将在运行时为平台创建一个名称,所以 |
| |
这是包含双箭头和等号的一行,好吧。 所以让我们呃...让我们从右到左读这个。 我们将获取该分发消息并将其发送到 bctable。 |
| |
所有这一切的结果,即平台,我们将保存在我称之为 distplat 的变量中。 |
| |
让我们运行一下吧。 |
| |
好吧,看起来一样,但不同的是现在我有了这个 JSL 变量 distplat,我可以稍后在我的代码中使用它。 |
| |
你会用它做什么? 您可以使用它向输出添加红色三角形选项,所以在这里让我们把它... |
| |
让我们把分布报告带到您可以看到的地方。 |
| |
我们将采用 distplat 对象,这就是......这就是分发平台。 |
| |
看,将鼠标悬停在它上面,让我们运行这条线。 在分发平台中打开正态五分位数图。 就在那里。 |
| |
好的。 |
| |
最后一步是占领平台,将这个物体带到这里,然后 |
| |
从中获取一个报告,一个报告对象。 就是这一行。 将报告消息发送到平台对象,现在我们得到一个报告对象。 |
| |
如果您想访问代码中的这些值(报告中的任何数字或图形或图形元素),我们需要这样做,您将需要这个,好吧。 这个对象rdistplat。 所以只需再运行一次,rdistplat。 |
| |
我运行了它,你看不到任何可见的东西,但现在发生的事情是我有了这个对象,rdistplat。 它说它是一个显示框,稍后我们将讨论如何使用它来访问报告中的数字。 |
| |
好的,我要清除我的日志 |
| |
并从我们的开始 |
| |
实例探究。 |
| |
因此,我们要学习的第一项技术是在数据表中的不同列上一遍又一遍地重复相同的命令,使用 foreach 命令循环遍历列。 所以 |
| |
这是一个非常常见的需求,有时您需要做的只是一些简单的事情,例如更改列的格式或建模类型。 |
| |
它可能非常复杂,比如 |
| |
采取...对列进行转换并运行控制图并使用该控制图执行某些操作。 所以是的,它可以扩展;这种技术可以扩展。 |
| |
以下是我们如何在 JSL 代码中实现这一目标。 我们先点击右键,做我们想做的事。 对单个列执行此操作,然后我们将使用增强日志获取该代码, |
| |
这就是我们脚本的骨架。 我们将对其进行修改,以便循环遍历我们想要执行该操作的所有列。 |
| |
我们要使用的 for 循环、迭代方法是 foreach,这是在 JMP 16 中引入的,因此该技术在早期版本的 JMP 中不起作用。 |
| |
这也使用了一个称为 JSL 列表的概念,因此我们也将稍微讨论一下。 |
| |
好的,我要开始了 |
| |
在 JMP 中,让我从主窗口开始。 |
| |
我要...让我检查一下日志,确保它是干净的。 不,我必须删除一件事,清除日志。 好的,让我们点击我们想要做的事情。 我将打开一个名为 sc20 的数据表。 |
| |
您可以在网上找到的演示材料中找到该数据表。 |
| |
看看这个数据表,它有一个 ID 列,然后它有大约 20 个 |
| |
数据列。 这些有很多很多小数位,精度太高,我想将其截断到小数点后两位。 因此,让我们更改格式,以便仅显示数据的前两位小数。 |
| |
这是一个简单的点击操作。 右键,进入栏目信息, |
| |
我们将把显示格式从默认的最佳值更改为固定两位小数。 |
| |
好的,现在我们对 NPN1 执行了此操作,我们还想对其他 19 个列执行此操作。 |
| |
那么让我们检查一下增强日志。 |
| |
就是这样,这就是我们需要实现更改一列 NPN1 格式的代码,对吧。 然后要重用它,请转到红色三角形,您可以将脚本保存到剪贴板,甚至保存到新的脚本窗口。 |
| |
我将切换到另一个文件,我已经在其中完成了一些工作,因此我们可以进一步深入研究这一点。 |
| |
好的。 |
| |
所以这里的前两行...三行,这是日志中的代码。 好吧,我们要做的第一件事就是打开数据表。 |
| |
您可能已经注意到我已经编辑了一点,我编辑了我的长路径名,我的长目录路径到该文件。 |
| |
如果你这样运行的话 |
| |
只要 JMP 数据表 sc20 与此 JSL 文件位于同一目录中,它就可以工作。 因此,这就像您当前所在目录的本地文件路径。 |
| |
所以无论如何,我们只是从日志中打开数据表,然后我们在这里应用格式更改,固定十进制 10 个字符两位小数。 |
| |
表...左侧的列引用是寻址列的一种方法。 有几种不同的方法,但这是您在冒号中看到的一种非常常见的方法。 表 ref...ref...reference 位于冒号左侧,列名称位于冒号右侧。 |
| |
所以这又是直接来自日志。 |
| |
JMP在日志中就是使用这种方式来寻址数据表的。 我认为最好按照我们讨论的那样进行,最好在打开 JSL 名称时给出该名称,然后继续使用该 JSL 名称。 所以我把冒号之前的这个业务改为dt。 |
| |
所以这是相同的代码,只是......只是修复了一点,当我运行它时,是的,它具有正确的效果。 它打开数据表,然后 |
| |
将格式更改为两位小数。 好的,是的,现在我们有了这个,这是一件很容易的事情 |
| |
更改所有其他 19 列,对吧。 这里...这里是 NPN1,然后我可以复制该行并更改每个人并再写 19 次。 |
| |
是的,这当然是低效的,编程的伟大之处之一就是你......你不必多次做同样的事情,对吧。 因此,如果我们……如果我们只写一次,而不是写 19 次、20 次,那么维护起来就会更容易。 |
| |
我们是这样做的。 我们要做的第一件事是获取我们想要操作的所有列的列表。 |
| |
当我说一个列表时,我指的并不是一个通用的列表。 我正在谈论 JSL 列表,我正在谈论您在 JSL 中编程时使用的特定数据结构。 |
| |
列表只是容器中包含的几个对象,这就是我们使用它的方式。 因此,这里有三种创建列对象列表的方法。 |
| |
第一种方法是手动执行,只需键入所有内容。 所以如果我要运行这个 |
| |
三个表参考...三个列参考,NPN1、PNP1、PNP2。 |
| |
请注意我的代码中以及当我将鼠标悬停在该 CNames 变量上时的大括号。 当您看到那些大括号变量...那些大括号时,您就知道您正在处理 JSL 中的列表。 |
| |
好的,这是获取列表的一种方法。 我们来谈谈其他几种方法。 这就是我们最终将在本示例中使用的。 这是 |
| |
说,嘿,获取我当前数据表中的所有连续列,以及我在这里命名的数据表中的所有连续列,dt。 所以消息对象,创建一个新列表。 |
| |
那么让我们来运行这个吧。 |
| |
现在,如果我将鼠标悬停在 CName 上,您就会看到这就是我们想要的。 这是我们想要操作的所有 20 个列表。 |
| |
好的,最后一种方法是,您可以让用户选择数据表中的哪些列。 看起来像这样。 我只想选两个。 让我们选择 IVP 和 PNP4,选择两列。 |
| |
如果我运行这个, |
| |
我们得到一个列表,其中仅包含数据表中选定的两个列。 |
| |
好吧,但是,您获得了该列表,下一个工作是将格式化行应用于列表中的每个项目,这称为循环或迭代。 |
| |
所以这是老方法。 它使用JMP中的for命令。 这就是您在 JMP 16 之前要做的事情,我将其放在这里,供您仍在使用 JMP 15 时参考。 但, |
| |
您知道,这有点复杂,并且难以寻找新用户,因此,如果您在 JMP 16 中使用列表,则可以执行更紧凑、更易读的操作。 如果我想对列表的每个元素重复一个操作,我可以对每个命令使用它。 |
| |
好吧,让我们看看它在做什么。 它需要三个参数,参数之间用逗号分隔,我们将从右向左排列它们。 |
| |
最后一个参数是格式命令,对,应用格式,而不是为 dt NPN1 执行此操作,而不是为一列执行此操作,而是在此处放置一个占位符并选择列表项;你选择你想要的。 |
| |
对,这只是一个词,一个变量名,你选择它。 我选择了列表项。 这就是我们的占位符,这是我们要在列表中的每个项目上运行的命令。 哪个清单? 这份清单,好吧。 这就是我们的清单,这是第二个 |
| |
争论。然后第一个参数是占位符,对吧。 它告诉我们,我们正在使用该占位符来保存列表中事物的值。 |
| |
它位于大括号中,因此如果您重用此代码,请确保使用它。 |
| |
这就是整个事情的样子,我没有 20 多行代码,而是只有三行代码,其中包括打开数据表, |
| |
获取列名称列表,然后重复该操作...对所有 20 个连续列重复该操作。 运行整个过程,你会看到它是什么样子的。 |
| |
就是这样。 现在每一列 |
| |
格式中显示两位小数。 |
| |
好的,这是一个非常简单的例子,使用 for every 来做一些非常简单的事情 |
| |
在一个柱子上。 |
| |
让我向您展示一个稍微有趣的例子。 |
| |
这是一个示例,其中对于相同的数据集,对于 sc20, |
| |
我将为每一列制作一个控制图,然后将这些控制图附加到日记中,并将整个该死的东西保存为 PDF,好吧。 所以 |
| |
它对每个都使用相同的内容,并且具有相同的前两个参数,您知道,列表项是第一个,第二个是列表名称。 但现在我有很多代码作为第三项......作为每个项的第三个参数。 |
| |
那么我们开始吧。 让我们运行整个脚本。 |
| |
打开、运行一堆控制图,将它们放在日记中。 现在,如果我看看我的桌面,我就创建了这个东西,我的report.pdf,其中包含所有这些控制图、第一页以及用于分隔它们的分页符。 所以第一页,第二页,第三页。 |
| |
所以你也可以在自己的时间看一下这个例子。 它包含在演示材料中。 |
| |
好的,这就是我们要讨论的第一个技术。 让我们为下一个技术清除日志。 |
| |
好的,从报告中提取一个值。 这种情况在 JSL 中经常发生。 你做了某种分析,也许是分布,也许是回归,你需要 |
| |
得到一些东西,从那里收集一些东西。 也许是平均值或中位数。 也许它是回归的斜率系数或 P 值。 |
| |
这就是我们的工作,棘手的部分是,报告具有层次结构、高度嵌套的结构,沿着该层次结构、沿着该树向下移动以准确找到我们想要的内容可能会有点棘手。 所以我要教你一个技巧。 |
| |
诀窍是我们要像往常一样通过点击进行分析,然后我们想要抓取的东西, |
| |
我将把文本颜色更改为红色,只是进行较小的格式更改。 然后,当我们将该脚本保存到日志中时,我们将使用它来学习如何解决该红色项目 |
| |
在JSL。 那么让我们一起来看看吧。 |
| |
再次返回 JMP。 |
| |
我要打开 Big Class,好的旧 Big Class,让我们在高度列上运行分布。 |
| |
好吧,这是我的分布报告,我想从中提取一些内容。 假设它是中位数,在本例中,中位数是 63,我将把它放入 JSL 变量中,以便以后可以重用它,并且您知道用它编写或对其进行一些数学运算或类似的操作。 |
| |
这里有一个技巧,可以帮助您了解如何...解决数字 63。 |
| |
改变颜色,或者,你知道,字体或者其他我想要抓取的东西。 如果您从未见过这个,那么如何做到这一点,这是值得了解的。 |
| |
工具栏上有一个属性按钮,我相信这是 JMP 16 中的新按钮。 |
| |
因此,如果您打开此报告的属性。 |
| |
我们可以沿着这棵树走下去,找到我们需要的东西。 所以看看这个。 |
| |
数字列框,右侧。 请注意,当我单击报告的不同部分时,相应的 |
| |
item(它是一种显示框)在属性面板中突出显示。 |
| |
好的,所以我们可以看到,具有所有这些结果的这个东西是一个数字列框,其中包含所有这些数字,就像,我告诉过你我们只是要拿这个东西,我要改变文本颜色为红色。 |
| |
就这样。 |
| |
现在我要关闭属性面板。 |
| |
报告出来了,我们把这个脚本发送到增强日志。 |
| |
红色三角形,将脚本保存到日志中。 |
| |
现在查看该日志。 |
| |
这就是我们想要的部分。 您知道,它具有分布命令,其中部分将中位数和其他统计数据的文本颜色更改为红色。 现在让我们更详细地看一下。 |
| |
好的,这是代码...增强日志中的相同代码。 我只是将其复制到这里并对其进行了一些格式化,以便我们可以更多地讨论我们需要的内容。 |
| |
所以我们这样做的全部原因是为了得到这部分,我们现在要解释它,好吧。 它使用发送来报告,并在其中使用调度。 |
| |
我们将在这里真正关注调度的四个参数。 我们需要前三个,第四个参数是改变颜色,这确实不是我们感兴趣的。 我们感兴趣的是解决显示框的问题,我们想要的元素,好吧。 所以 |
| |
第一个参数是导航。 它告诉我们,向下到显示框,这些实际上是轮廓框,向下到轮廓框 |
| |
这里。那么让我们看看该报告。 我再次确信您已经在 JMP 中注意到,在报告中您有这些级别的嵌套,对吧,而我只是...... |
| |
外部轮廓盒分布。 其中有一个轮廓框高度,其中有一个轮廓框分位数,而在该分位数内有一个是我需要提取的内容。 |
| |
这就是它告诉我的。 它告诉我要走下那棵树。 我只需要高度和分位数,这将为我们识别它。 |
| |
好的。 接下来的两个参数告诉我们一些关于这个的事情……我们正在尝试的这个元素,我们变成了红色。 它告诉我们......第三个说明了它是什么,它是一个数字列框,我们在属性中看到了这一点。 |
| |
第二个参数告诉我们标题 |
| |
该数字的列框。 这个是空白的 这个没有标题,没关系。 我们可以...我们仍然可以使用这些信息来获取该数据,所以有时您会在这里看到标题,有时则看不到。 |
| |
好的,现在我们有了这个,我们将获取该信息并使用它 |
| |
提取中位数。 |
| |
这是执行此操作的代码。 它从第 23 行开始,经过第 29 行。 |
| |
我们再次打开数据表, |
| |
命名分布,执行连续分布。 |
| |
您会注意到,我们没有任何调度和发送报告,这是因为我们不需要在生产脚本中将其变为红色。 |
| |
所以,是的,执行分布分析,命名平台。 |
| |
这很重要,您必须...您正在访问报表层。 您将使用这一行提取它,从而创建 rdist,即该报告对象。 |
| |
然后,这就是奇迹发生的那一行。 这就是我们要抓住的地方 |
| |
中值,将其分配给 JSL 变量 mdn,对于这个,我们将把它写入日志。 因此,我将告诉您更多有关此内容的信息,但首先我们只运行一次,以便您了解它的作用。 |
| |
我要运行第 23 行,哎呀,让我们这样做吧。 让我们运行第 23 行到第 29 行。 |
| |
进行了分发。 它不是红色的,我们提取了中位数,它现在存储在 mdn 中,您可以看到该变量的值为 63。 |
| |
中位数是 63。 完美的。 |
| |
好吧。 |
| |
所以这是我们提取的那一行 |
| |
中值,即报告中的数字 63。 |
| |
我们来看看吧。 我只是想在这里调用它,以便我们可以 |
| |
当我们这样做时,请参考这一点。 |
| |
这就是那条线。 它只是再次组织起来,以便我们可以单独查看每个元素。 |
| |
63,报告的中值。 |
| |
以下是我们如何做到这一点。 |
| |
这称为下标...下标。 当您在 JSL 代码中看到方括号时,这意味着您为一个对象添加了下标。 该对象是某种容器,可以是显示框, |
| |
通常是一个列表。 您也可以通过这种方式为列表添加下标。 所以我们正在做的是,是的,我们正在此报表对象中提取嵌套项目。 |
| |
我们要做的第一件事是高度轮廓框。 你记得这一点,然后从那里我们进入分位数框,你记得这一点。 |
| |
现在我们来对地方了。 我们只需要抓住我们想要的东西,我们想要的是数字列框,对吧,因为它没有 |
| |
我们可以使用的标题(就是上面的标题,没有标题),而不是我们通过数字来引用它。 它是分位数轮廓框中的第一个数字列框。 |
| |
所以你可能会看着这个并对自己说,等一下,这里有数字。 那也是一个数字栏框,不是吗? 不,实际上不是。 这是一个字符串 col 框,请记住,如果您愿意,您可以检查所有这些内容。 这又是来自属性。 |
| |
如果我点击这里, |
| |
数字列框、字符串列框、字符串列框。 在这里看到他们吗? 字符串...字符串数字,因此它是第一个数字列框。 |
| |
这将获取所有这些数字。 |
| |
好的,我们需要做的最后一件事就是这个下标。 这样下标表示,给我第六个元素...1,2,3,4,5,6。 这是中位数;现在是 63。 当我们运行这一行时,它会为报告添加下标;它抓住了中位数,以便我们以后可以重用它。 |
| |
因此,有一种方法可以从报告中获取某些内容。 我还有另一个例子,我将在演示材料中分享 |
| |
一个确实有标题的元素,你可以看到,如果你遇到这种情况,你可以使用它作为模型来完成你自己的工作。 |
| |
好吧,我们要讨论的最后一件事是如何从运行脚本的用户那里获取输入。 |
| |
让他们选择要分析的文件,甚至是要分析数据表中的哪一列。 所以这可能是最常见的 |
| |
新手脚本编写者想要做的事情。 您知道,我已设置脚本在一个专栏上执行某些操作,并且我想为组织中的其他人提供一些内容 |
| |
让他们自己根据不同的数据来做,对吧。 因此,如果您......如果您以这种方式概括您的脚本,让您的用户选择文件或列,或两者, |
| |
你正在推广你的脚本并且大大增加它的价值。 您将把它交给组织中的其他人。 他们可以复制您的工作并快速完成,而无需进行所有点击。 |
| |
好的,在本节中,与其说是案例研究,不如说是一份清单。 我们将...我将向您展示三种可以让用户选择文件的方法以及两种可以用来让用户选择列的方法。 |
| |
我们将从选择文件的方法开始。 像往常一样,我们首先在日志中执行一些操作,然后复制它。 这是...这是打开 Big Class 时的样子,您只需在日志中找到此内容,然后打开 Big Class。 |
| |
dt。在本例中我使用 dt,因此,当我打开 Big Class 时, |
| |
现在它已经...dt 指向 Big Class,好吧。 然后我会继续我的制作脚本,对吧。 |
| |
事情是这样的,为了让你的用户选择他们想要的文件,我们需要做的就是找到一种方法让 dt 指向其他东西。 |
| |
编写脚本的其余部分,使用 dt,然后在开始时,您可以更改它。 dt不再仅仅指Big Class;它会指向别的东西。 |
| |
好吧,那是由用户决定的其他事情, |
| |
运行脚本的人。 好吧,我认为这是您可以做的最简单的事情,您可以...您可以使用这一行而不是打开数据表。 如果您在脚本开头使用它来分配 dt, |
| |
这意味着 JMP 将运行此脚本并给出 dt |
| |
为前面的任何数据表命名。 |
| |
那么从用户的角度来看,他们所做的就是打开一个数据表,我这里要打开sc20,并且使sc20 |
| |
我当前的数据表。 看到这里了吗? 该窗口中列出的是当前数据表。 |
| |
因此,如果您的用户打开数据表,然后运行脚本,然后遇到此行,则 dt 现在将指向 sc20。 |
| |
所以这是一个非常强大的方法。 它的问题是......它要求您的用户确切地知道要做什么。 他们必须知道必须先打开数据文件,然后运行脚本。 |
| |
我们可以做一些更稳健的事情。 我们可以在他们运行脚本时向他们显示文件选择器,以便他们可以浏览目录结构并找到要打开的正确文件。 |
| |
事实证明,这非常简单。 你所做的就是删除这里的所有内容,删除对 Big Class 的引用,然后直接说 open ,不带任何参数。 |
| |
当 JSL 尝试...当 JMP 尝试解释这一行时,它会说,好吧,用户想要打开某些内容,但我不知道什么...不知道什么。 让我们向他们展示一个文件选择器,以便他们做出决定。 |
| |
那么让我们...让我们运行这个。 dt = 打开。 |
| |
运行脚本。 这是通用文件选择器,我将在我的桌面上打开 Iris。 |
| |
Iris 是打开的,当然,它有 dt 名称。 |
| |
所有 JMP 文件,所有文件,对吧。 这里可能会显示很多东西。 |
| |
所以如果你需要更多的控制,哎呀,如果你需要更多的控制 |
| |
您的用户将要做出的选择,我们将使用称为“选择文件”的东西,而不是使用“打开”。 |
| |
选择文件是一个具有几个不同选项的命令。 我只使用其中三个。 |
| |
让我们看一下这个例子。 因此,选择文件的前三个参数是您将在选择器窗口中看到的标题, |
| |
选择器将启动的目录,以及告诉您可以从该选择器打开哪些文件的过滤器,对吧。 那么让我们运行这...这一行,这一段代码,pick file 命令,将结果保存在 PF 中。 |
| |
运行那个。 |
| |
好的,请注意,这就是这里的争论,选择 Excel 文件。 这就是我们在窗口标题中看到的内容。 |
| |
文件夹,第二个参数中的路径,那就是它的开始位置。 |
| |
第三位,文件过滤器,它说,嘿,只显示用户要打开的 Excel 文件,就在这里。 我不被允许更改 Excel 文件。 我仅限于 Excel 文件。 |
| |
假设是三明治,然后单击“打开”。 |
| |
嗯,等一下,为什么没有打开? |
| |
好吧,让我们检查一下。 PF 等于拾取文件。 什么是PF? 啊,PF就是我们要打开的东西的路径。 我们还没有发出打开命令。 选择文件不会打开文件,它只是选择一个文件。 |
| |
因此,为了关闭这个循环,我们必须这样做。 通过打开创建我们的表引用 |
| |
PF变量,它指向我们想要的文件,我们想要的excel文件。 |
| |
就在那里。 这将打开三明治数据表,现在我有了我的 dt,并且准备好继续执行我的脚本,就像我想要的那样。 |
| |
让我在这里暂停一下,向您展示一些重要的事情。 选择文件,如果您遇到类似的情况并且您不知道所有参数并且您想了解更多信息,请注意以下几点。 首先你会得到一点 |
| |
将鼠标悬停在帮助上,会弹出一个小窗口,其中包含有关语法的一些信息。 这是一个更好的选择。 在脚本窗口中右键单击它, |
| |
您可以在脚本索引中查找它。 脚本索引对于任何 JSL 程序员来说都是一个非常重要的工具,并且 |
| |
它有您正在查找的命令。 它有参数列表、一些解释性文本,而且非常重要的是,它有几个示例,您可以运行它们并了解它的作用。 因此,如果我在这里运行这个示例,它将给我一个选择文件。 |
| |
好吧,它把我带到了一个我不想去的地方。 |
| |
让我们关闭它吧。 |
| |
好吧,然后我们就可以实验并获取此代码,窃取此代码并在我们的...脚本中使用它(如果我们愿意的话)。 |
| |
好的,这就是脚本索引。 也可以从帮助菜单中找到它。 脚本菜单...看看上面的东西。 |
| |
当前数据表、裸露打开或拾取文件。 还有其他方法,但这三种方法都是不错的选择。 |
| |
现在我们来谈谈让您的用户选择他们想要操作的列。 |
| |
我在这里……我从日志中复制了一些东西。 我打开了一个名为“价格”的数据表。我在上面做了一个图表,显示了苹果随时间变化的价格。 |
| |
我不会向您展示点击部分,我只是要运行脚本。 我想您已经知道如何从增强日志中提取脚本了,所以让我们看看该脚本做了什么。 打开价格,这是我的图表,苹果与日期,苹果随时间变化的价格。 |
| |
所以看看这个数据表,价格,是的,有苹果,但我也有所有这些人,对吧。 那么,如果我想让我的用户告诉我他们想要看到什么图表,他们想要看到哪一列的图表呢? |
| |
这就是本节的主题,让...让您的用户选择。 |
| |
好的。 |
| |
所以我们将讨论两种方法。 这是第一个。 |
| |
它对用户选择的列进行操作。 |
| |
我们以前已经见过这种语法,我想,在我们的第二个案例研究中。 是的,这就是我们列清单的方式 |
| |
包含在数据表中选择的列。 让我回到那个数据表。 |
| |
我要选择,也许三列, |
| |
我们跑吧 |
| |
这。实际上我认为我应该运行 dt。 让我们运行这两个。 |
| |
鸡肉、咖啡和鸡蛋。 |
| |
好的。 |
| |
所以。 |
| |
我想对哪一个进行手术? 好吧,您知道如何操作,如何使用循环迭代列表,但我们不这样做。 我只想使用捷径。 我要说你看, |
| |
如果我的用户选择了多个,只需为他们绘制第一个即可。 所以我的用户在运行脚本之前选择了鸡肉、咖啡和鸡蛋。 我只想给他们关于鸡肉的图表。 |
| |
是的,这就是下一行。 这是我们的订阅。 我们对 CNames 列表进行下标以获取第一项。 |
| |
所以我们将运行这个。 |
| |
现在我有了那个不错的变量,我的同事, |
| |
其中包含列表中的第一项“鸡”,以及带有冒号的列引用。 |
| |
现在我们可以运行我们的图形生成器了。 现在我们可以继续我们的生活了,唯一的区别是我们已经用苹果代替了这里, |
| |
那现在是我的上校了。这是我们所做的唯一更改,因此运行此程序,我们将获得鸡肉价格的图表。 |
| |
好的。 |
| |
好吧,这是一种方法,但同样,就像我们之前讨论的那样,这需要用户知道他们必须做什么。 这需要... |
| |
方法要求用户必须知道他们必须打开数据表,选择它,然后运行脚本,这有点麻烦。 所以 |
| |
相反,在运行时向用户显示列选择器对话框会更加稳健。 看起来是这样的。 语法有点复杂。 我不会深入讨论所有细节,从高层次上讨论它。 我们像以前一样打开数据表。 |
| |
我们正在使用这个称为“栏对话”的命令 |
| |
向用户显示选择器...列选择器。 |
| |
同样,它有很多论点。 我只用了几个。 我正在做的是,嘿,给我一个选择商品的按钮,用户最多可以选择一列,并且他们必须至少选择一列。 |
| |
所以在这里,让我们从第 60 行开始运行这个脚本。 |
| |
开盘价,这是我的对话,看看我用很少的代码就有了多么丰富的对话。 这就是我们使用的专栏对话的优点。 因此,我将选择咖啡,然后单击“确定”。 |
| |
好的。 回到脚本,我们刚刚运行了这一行。 |
| |
我们选择的结果存储在dlg中。 让我们看一下。 |
| |
好吧,这有点复杂。 它说 dlg 是一个列表,请参阅大括号,我有一些嵌套的大括号,所以它就像嵌套列表。 |
| |
这是带您到达那里的订阅。 我不会花很多时间解释这一点,但如果您...如果您需要这样做,您可以复制此代码。 因此,要从对话中获取提到咖啡的部分,即那里提到咖啡的专栏, |
| |
这是创建我的 col 的下标,所以运行这一行。 |
| |
现在,我的列仅包含对咖啡列的引用,并且这与之前相同。 我们使用运行图形生成器 |
| |
我的同事,用它代替苹果,这样我们就可以得到咖啡或用户选择的任何其他东西。 |
| |
好的,这就是我想与您分享的一切。 最后,我将为所有以这种方式开始 JSL 编程的人提供一些建议。 |
| |
我们的建议是,让 JMP 尽可能地纠正您的代码。 这就是增强日志的用途,从日志中窃取该代码。 这就是你的大部分脚本, |
| |
然后你只需要编写结缔组织,即将东西结合在一起的部分,并将其制作成可用的生产脚本。 您也可以窃取该代码。 您将从脚本索引中窃取它,您当然可以从该演示文稿中窃取它。 |
| |
所有材料都包含在本演示文稿中,您还可以从 JMP 用户社区中的 JSL 食谱中获取,这是一个很棒的资源,其中包含许多常见的 JSL 任务,并为您提供完成这些事情所需的代码。 |
| |
我要再次强调,真的不要太在意语法。 获取代码并替换您需要的代码会更容易。 您不会破坏任何东西,并且您将通过更多的经验了解这种语法的微妙之处。 |
| |
非常感谢您的关注。 |