我在其中一封电子邮件中确实提到了一些可能的主题,但这里有一些想法:
- 使用引用
- dt = Open()... 等等,而不是 Current Data Table()
- 以稳健的方式查找对报告的引用/在报告层中
- 管理命名空间/范围
- 初始化变量
- 寻找编程风格
- 全局变量用大写
- 利用表达式
- 试着抓
- 日志记录
- 按钮/窗口中的变量
- 特别是从函数返回时
- 上下文框(),窗口:
- 按钮 - 路径
- 打包脚本
- 无需使用大量 JMP 创建脚本,而是将其中的各个部分分离为更强大的脚本
- 最佳实践
- 避免清除/删除符号/全局变量
- 不要留下清除日志脚本
- 锁定变量/命名空间
- 路径
- 转换文件路径
- 默认目录
- $PATH_VARIABLES
- 引用列
- Column(dt, "colname") vs dt:colname vs :colname, vs dt:"colname"n (和 AsColumn) 等等...
- 浮点数学
- 三思而后行VS 写代码时请求原谅比请求许可更容易
- 缺失/空值
- 为空()、缺失()、如果、如果MZ、N 项() > 0
- 检查打开的表、打开的报告、已打开的自定义窗口......
- << 将窗口置于最前面
- .jsl 中的 Throw() 与 jmpaddin
- 自定义模态窗口函数
- 改进(和利用)JMP 创建的脚本
- 添加引用/变量
- 缩短 JMP 创建的脚本
- 避免调度
- 用户偏好如何影响这些(通常会导致非常大的问题)
- 理解和利用数据结构
- 例如,不需要将所有内容存储在不同的变量名中(特别是在使用 Eval Parse 时)
- 使用列表/关联数组
- 如果谈论 UI,可以在需要时提供参考
部分相关的帖子(由于“新” JMP 社区页面,可能看起来非常混乱)
谢谢,在这里我可以分享一些我自己的,但我所做的大部分已经在上面提到了:
- Try(close(dt_ref,nosave)); dt_ref = Open(...) --> 清理表,并且脚本首次运行时不会产生错误。问题是,您可以重命名表,但 JSL 仍会关闭它,因为 dt 引用也会切换。
- 使用 always 标签来识别更大的循环和函数,这样您就不会迷失在代码中并搜索缺失的 );
- 如果您发现可以使用多种语言,请考虑在制表步骤后重新命名列。这可能会破坏其他用户的代码,但您的代码可以正常工作。
- Try to dynamically work with reference in platform to avoid user inputs.
You could do this:
dt << Process screening(Process Variables({:Column 4, :Column 6, :Column 7}));
But you can also use this:
dt = current data table();
col_names = dt << get column names();
spec_list = {};
for(k=1,k<=nitems(col_names),k++,
if(!isempty(column(dt,k) << Get Property("Speclimits")),insertinto(spec_list,col_names[k]);););
dt << Process screening(Process Variables(eval(spec_list)));
altering a column name will then not break the code and the question about missing spec limits will not be triggered. -
我最有可能选择类似附件的内容(我肯定没有足够的时间浏览所有内容,但这应该不是问题)。最终可能会选择类似“JSL 提示”的内容,但创建它已经花费了足够多的时间。
谢谢 Jarmo,我对剧本有一些想法:
第 103 行:我只在循环很短且仅执行一行时才使用它。这可以使代码更加时尚。
第 109 行:使用短名称时,您可能会遇到使用变量(如 mean = (x1 + x2 ) / 2)覆盖 JMP 函数的问题;最好写为 m_production_speed 或 mean_production_speed。
第 149 行:我养成了在逗号后立即注释 if 循环的习惯,以便进行代码折叠:
如果你像这样编写代码:
if(1,//average of x
mean_x = mean(x);
);
折叠代码后它将看起来像这样:

它为我节省了 for 循环或 if 语句上面的一行。
第 198 行:“让我们初始化矩阵,因为如果提前创建它,填充它会更快”。这花了我 1 分钟的时间与 copilot 配合,我无法想象调试有 200 条评论的代码 *g*。
第 212 行:我想说的是,你可以使用日志和工作流作为参考,然后根据你的编程风格修改代码。当我要求非编程用户制定一个工作流,说明他们想要用我应该为他们编写的脚本实现什么时,尤其如此。因此,我很好地理解了他们想要什么,并且已经编码了大部分功能。
第 391 行:当您在打开图形生成器的情况下迭代表格时,这可以加快脚本速度,这样它就不会在每次更改时更新图形。
Names Default To Here( 1 );
try(close(dt,nosave));
dt = new table("test");
dt << New Column( "Y",
Numeric,
"Continuous",
Format( "Best", 12 ),
<<SET initial="" data="https://community.jmp.com/"></SET><SPAN>第 414 行:除此之外,我想补充一点:在使用 << Subset 等函数时,如果给出固定名称,请务必添加表引用)这在生成名称已经存在且 JMP 会自动在末尾添加“ 2”时非常有用。如果没有引用,您可能会意外地在错误的表上工作。</SPAN>
<SPAN>第 74 行:这是我要偷来用于我的脚本的东西</SPAN>:)</img>
<SPAN>line757:这有时也会减慢循环速度。但在处理 SQL 语句时很有用,因为发送请求可能会超越脚本的其余部分并导致错误,因为获取数据可能需要一些时间,但逐行执行代码时效果很好。</SPAN>
line 780: maybe referencing to the JSL cook book? <A href="https://community.jmp.com/t5/JSL-Cookbook/tkb-p/jmp-scripting" target="_blank">JSL Cookbook - JMP 用户社区</A>
line 787: Just be aware that this will also break when a report reference name contains a variable.
This is what happened here: <A href="https://community.jmp.com/t5/Discussions/fitting-truncated-data-to-a-continuous-distribution/m-p/772495#M95287" target="_blank">回复:将截断数据拟合到连续分布 - JMP 用户社区</A>
the detection limits is added with censored data in the title and can change depending on the data set.
THX a lot for the script.<BR /><BR />Regards<BR /> Mauro
787 行
这就是为什么几乎总是使用带有 helpKey 属性的 XPath(如果可用的话)(我不关心 outlinebox 标题)。有太多方法(尝试)构建强大的引用,我可以用大约 20 分钟来举例说明。
例如,对于检测限制,我会使用 helpKey 或通配符(如果我知道轮廓框名称可以改变......)
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
Column(dt, "height") << Set Property("Detection Limits", {60, 100});
dist = dt << Distribution(
Stack(1),
Continuous Distribution(
Column(:height),
Horizontal Layout(1),
Vertical(0),
Process Capability(0),
Fit Normal
)
);
obs = Report(dist) << XPath("//OutlineBox[@helpKey='FitDistributions']");
show(obs << get title);
// Or
ob = Report(dist)[OutlineBox("Fitted Normal Distribution?")];
show(ob << get title);
// Or
obs2 = Report(dist) << XPath("//OutlineBox[contains(text(), 'Fitted Normal Distribution')]");
show(ob << get title);
</CODE></P>
<P>I also added few things based on your comments. Thanks!<CODE class=" language-jsl">