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