Ready to learn about stringing everything together into an actual script?Ready to learn about stringing everything together into an actual script?Ready to learn about stringing everything together into an actual script?Ready to learn about stringing everything together into an actual script?准备好了解如何将所有内容组合到实际脚本中了吗?欢迎回到我的关于脚本编写基础知识的系列联合管理计划。 这是专为您设计的系列中的第五篇文章。 如果您刚刚加入我们,您真的会想看看早期的条目该系列,因为这个太棒了。 以下是它们的链接供您查看:
好的? 还在? 你看过前面几集吗? 出色的! 向荣耀前进!
从几周前的家庭作业中,我们都应该有一堆使用的 JSL 片段保存脚本到脚本窗口或脚本索引来获取我们需要的代码片段。 你做过做你的作业,正确的? 好的! 让我们将所有内容串在一起形成一个实际的脚本。 但首先,我们得聊聊。
Mikey 的编码宠物之一皮皮鬼
好吧,伙计们。 让我暂时站起来谈论一些事情。 当我们写代码的时候,我们必须总是评论一下吧! 我们不能对在我们之后阅读我们代码的人(包括我们自己)做出任何假设。
回到大学时,我参加了 Visual Basic 编码课程。 我们学到的第一件事是如何注释代码和编写伪代码。 顺便说一句,伪代码是您在编写代码之前编写的注释,可帮助您确定需要做什么(它们类似于我让您编写的遗留问题清单)第一篇文章)。 讲师将评论和伪代码称为“成为编码社区的好公民”。我们甚至会根据我们对提交的代码的评论程度进行评分。 就是这么重要。
事实是,您很少能够完全控制谁可以看到您的代码。 恰当的例子:在本博客系列中,我向您提供了有关如何对其他人的加载项进行逆向工程的分步说明。 我可以保证,编写这些加载项的一些(如果不是大多数)人并不希望其他人偷看他们的代码。 我还可以保证您不会在代码中找到那么多注释来帮助您弄清楚发生了什么,正如您希望的那样。
您需要对代码进行注释,以确保稍后查看代码的人可以轻松理解您在做什么。 是的,评论是一件痛苦的事。 是的,这需要额外的时间。 但,不,你不能跳过这件事。 从长远来看,它将带来红利。 我确实言行一致。 我有五年前编写的插件,我仍然可以理解,因为我做了详细的评论(而且我仍然记得这样做是多么乏味!)。
因此,那些已经编码过的人,请确保对代码进行注释,以便其他人能够理解您在做什么。 那些正在学习的人,要养成并保持对代码进行大量注释的习惯。 现在,让我从这个演讲台上下来,向您展示如何做。
在 JSL 中发表评论
让我们打开 JMP 并打开我们一直在使用的 Big Class Families.jmp 数据表。 如果您没有保存上次会话中的脚本示例,请继续并重新创建它。 你应该有类似这样的东西:

有两种方法可以将注释添加到 JSL 代码中。 第一种是使用双正斜杠(“//”)注释掉各个行。 斜杠之后直到回车(按键盘上的回车键)之前的任何内容都将被忽略。 我通常使用这种方法来进行简短的内联评论。 关闭您不想运行的单行代码也很有用。 让我们看看这意味着什么:

第二种注释方式用于您想要关闭大块代码或生成大块注释和文本的情况。 这种类型的评论称为评论块。 它是使用由正斜杠和星号(“/*”)组成的开始注释标志和由星号和正斜杠(“*/”)组成的结束注释标志来完成的。 以下是如何使用它的示例:

请注意,我不是在讨论评论风格这里。 这实际上取决于你。 随着您的发展,您将形成自己的风格,甚至可能出于不同目的而采用不同的评论风格。 我的内联注释(如示例中的注释)与我在应用程序之类的东西中所做的注释完全不同。 重点是编写注释并在脚本中与您的操作方式保持内部一致。
整个系列中最难的部分
事实上,整个系列一直在引导接下来的项目。 要开始使用 JSL,您需要了解三个核心知识。 第一个是评论(请参阅本文前面的讲道)。 第二个和第三个是如何命名事物和如何发送消息给他们。
我想可以编写自己的方差分析算法(我的一位同事讲述了一个非常有趣的故事)。 但是,通过消息告诉数据表使用 Fit Y by X 运行方差分析要容易得多,就像我们在上一集中学到的那样。 JSL 的大部分内容就是基本工作流程(命名某个内容,向其发送消息)。 是的,您可以进入逻辑和循环、GUI 开发等,但强力脚本编写实际上只需要名称、消息和一些脚本索引搜索。
命名事物
让我们从命名事物开始。 您可以通过为 JMP 命名一个名称,并在其后面加上等号,然后编写您希望该名称代表的文本、数字、代码等来命名事物。 这个名字叫做多变的。 您可以将变量视为可以放入内容的容器,或者将其视为打开报表的昵称联合管理计划。
让我们看一个使用方差分析的示例。 要创建 ANOVA 代码,请首先在“Fit Y by X”(在“分析”下)中运行分析,然后打开 ANOVA 测试,然后将代码保存到脚本窗口中。 以下是使用 Big Class Families.jmp 的报告以及从红色小三角菜单中保存的生成的 JSL 代码(身高为 Y,性别为 X,然后选择均值/方差分析/合并 t在红色三角形下):


这个小 JSL 片段将为任何与原始数据表具有相同列名的数据表生成方差分析。 (不过,在本系列中我们不会担心参数化。 有点超出范围了。)
现在,如果您打开了一堆数据表并且想要控制要在哪个数据表上运行方差分析,该怎么办? 那么,您可以通过为要运行方差分析的数据表指定名称来编辑脚本,然后将 JMP 生成的代码作为消息发送。 如果您要查看脚本索引(请参阅有关获取帮助的文章),您会找到几种方法来执行此操作。 您可以直接调用数据表,也可以使用 Current Data Table() 获取对 JMP 当前关注的数据表的引用。 第三个选项稍微高级一些,您可以在打开数据表时为其指定名称。 我在下面列出了所有三个示例(并再次注意使用注释来传达信息!):

只要打开的数据表具有您尝试使用的名称,就可以按名称调用数据表。 如果您有要使用的数据表名称列表,这会很方便。 如果您隐藏或最小化了数据表,它也会很方便。 在任何一种情况下,即使您不一定能看到它,您仍然可以将消息发送到数据表。 该方法使用以下形式:
<变量名> = 数据表(“<数据表名>”);
就我们的目的而言,将变量分配给数据表的最有用方法可能是使用 Current Data Table () 函数。 此函数获取活动或当前数据表的任何内容,并将其分配给您指定的变量。 将表分配给变量后,另一个数据表是否成为“当前”数据表并不重要(例如,通过创建汇总表,您将始终拥有对第一个数据表的引用,直到重新定义变量为止)。 它有一个更简单的形式:
<变量名> = 当前数据表();
如果您想假设有人运行脚本时数据表可能未打开,则最后一种方法很有用。 通过使用此方法,JMP 将生成一个文件对话框,允许用户选择要打开的文件。 当用户确认他们的选择时,文件将被打开并分配您指定的变量名称。 同样,这是一个简单的形式:
<变量名> = Open();
使用打开(…);如果您习惯使用文件路径和目录,该方法也会很方便。 您可以将文件路径放在括号内,以告诉 JMP 在哪里查找文件,如下所示:

另外,请注意,我正在使用一种称为路径变量在里面打开(…);命令来缩短字符串。 中有一个关于它们的部分脚本指南。
发送消息
现在,一旦您命名了某个内容,就可以向其发送消息。 它的工作原理类似于通过手机向某人发送短信。 当您发送短信时,您首先需要知道收件人的姓名、电子邮件地址或电话号码,以便识别他们的身份。 您将其输入消息应用程序,然后发送消息。 以下是使用大类方差分析的方法。 在这种情况下,我将享受一些乐趣并让 JMP 要求我打开一个文件:

让我们从第 5 行开始解压我们在这里看到的内容。 我们首先看到的是我们想要给出指令的数据表的变量名称。 就像我们向某人发送短信或发出指令一样,我们必须确定我们正在与谁交谈。 接下来是两个“小于”符号(<<)。 我们已经在 Glue Operator (;) 中看到过类似的情况。 “<<”符号称为消息运算符。 它让消息接收者知道接下来是一条消息。 之后,我们看到一个名为 Oneway(...) 的函数;以及函数创建方差分析报告所需的参数。 注意:您可以在文档或脚本索引中获取有关该函数的选项的所有信息,但实际上不必手写任何内容。 只需运行一次分析并使用其中之一获取完成的脚本(带有所有选项)将脚本保存到...我之前向您展示过的命令。
一些零碎的事情
好的,最后三个细节需要解决。 首先是把事情串联起来的问题。 例如,如果您想在同一脚本中执行方差分析并创建图形生成器,则需要警告 JMP 需要遵循进一步的说明。 为此,请使用我一直提到的粘合操作符 (;)。

就像书面英语中的分号一样,命令末尾的分号让 JMP 知道还有更多指令即将到来。 胶水位于 Bivariate(...) 等指令的末尾。 ; ,或分布(...) ; ,或给某物命名:stuff = 5 + 6 ; 。 您可能还记得之前的帖子,当我们使用 JMP 时,JMP 会自动包含分号保存脚本...到脚本窗口,但是在徒手编写脚本时,这恰好是我在编写脚本期间犯下的最常见错误 - 忘记将事物粘合在一起。
第二个细节是确保您的脚本在 JMP 会话中是良好的公民。 这是通过将您创建的所有变量分配给名称空间。 命名空间是一个小沙箱,可以防止您创建的变量名称干扰软件的其他部分。 默认命名空间称为“Here”命名空间。 在脚本中,它看起来像这样(参见第 2 行):

该指令应始终位于脚本的开头(直到您了解何时不使用它!),以防止变量名称与其他脚本或 JMP 的部分发生冲突。 在你开始在这一点上大惊小怪之前,这里有一个我刚才所说的 TL;DR 版本:只要记住总是把“Names Default To Here(1);”在脚本的开头,暂时就可以了。 如果您想了解有关命名空间的更多信息,请参阅有关该主题的段落我不久前写的另一篇文章。
我需要讨论的最后一个细节是如何更改已保存脚本中的列名称。 这真的很简单。 查看您保存的脚本。 您应该会看到列名称前面有一个冒号(“:”)。 该冒号表示它们是列名称(它可以表示其他含义,但目前,它表示列名称)。 要更改列名,只需更改它即可,但请记住将冒号放在前面。 如果您的列名称包含特殊字符,则当 JMP 为您输出脚本时,您可能会遇到类似 :Name(“...”) 的情况。 这就是 JMP 处理列名中包含的字符的方式,如果不清楚这些字符是否是字符串的一部分,则会导致问题。 尽管在我们的脚本中使用 :Name(“...”) 是一种不好的编码形式,但软件会使用它,因为它没有选择。 您应该尝试选择更好的列名称。
但你忘了...
好吧,我意识到你们中的一些人此时可能会有点紧张。 您可能会想,“您忘记了函数!!!”或者“但是表达呢!!!”甚至,“你这个混蛋!!! 你完全忽视了逻辑和循环!”首先,直呼其名并不好。 其次,我没有忘记任何一件事。 我有意识地省略了它。
问题是,这个系列并不是为了让你把头发吹到后面。 就像我在本系列开始时所说的那样,它的目的是为您指明正确的道路,为您提供一张好地图,一些零食,鼓励您,并告诉您在遇到困难时到哪里寻求帮助。 这是一个起点。 (顺便说一句,你现在已经得到我的允许吃点零食了。)
对于我们这些经常编写脚本的人来说,我在这里谈论的很多内容都是非常基础的,非常基础的,以至于它是肌肉记忆。 我们忘记的是,仅通过使用我在这里介绍的基础知识,新手脚本编写人员就可以涵盖很多内容。 不管怎样,如果你因为我没有介绍任何超级花哨的东西而感到呼吸过度,放松一下。 我们将在下一个系列中深入兔子洞。 现在,让我们回到讨论上来,谈谈本周的作业。
家庭作业
好吧——我们到了。 大作业练习。 本周,您将把上周编写的代码片段粘合在一起。 一次一点地执行此操作。 如果您的脚本将位于数据表之外(作为 JSL 文件),那么首先打开数据表并将其放入变量中。 之后,无论您的脚本将存放在哪里,都可以添加一些内容并检查它是否符合您的预期。 然后添加更多并再次检查是否获得预期结果。 请记住,社区、帮助文件等都是您的朋友。 如果收到错误消息,请查看日志(查看 > 日志对于个人电脑和窗口 > 日志对于 MacOS)和上一集。
祝你好运,下周见!