Scripters Club 录音:提示和技巧视频 1 @thickey1 :管理数据表。
- 修改列名。
- 引用列名的替代方法。
- 在表中添加/嵌入脚本。用户可以随时运行该脚本。
(文件:技巧和窍门以及探测)
视频 2 @Georg :关于如何编写脚本和使用 JMP 脚本编辑器的一般技巧
- 代码折叠
- 表达式处理
- 公式中的 JSL
- eval (eval expr(一些带有 expr 的代码(首先要评估)))
- 测试变量类型
- 关联数组
(文件:20241120_Scripters_Club_tipps_and_tricks-inspec)
视频 3 @Mauro_Gerber :打开多个导入并获取当前脚本的路径
(文件:SC-2024_ini 和 SC-2024_multi-import)
视频 4 @Daniel_Valente :JMP Marketplace 概述
https://marketplace.jmp.com/
我不敢将Ndoubled设置为 10:)
我的梦想:快速、动态且易于使用:folded_hands:符合规格(价值)
按照“烤我们的代码”的想法——有什么想法可以提高速度吗?
以及如何让其他 JSL 经验较少的用户也能使用这种方法?


回复:Scripters Club 录音:提示和技巧这个更快 - 但是当规格调整时不会触发更新。
因此目前来看:与
对于每个(... dt [0,colname] = ...)
或新列(设置值())
Names Default To Here( 1 );
Ndoubled = 10;
dynamic = 1;
Try( Close( cdt, NoSave ) );
cdt = Open( "$SAMPLE_DATA/Semiconductor Capability.jmp" );
Wait( 0 );
bigger = Expr(
cdt = cdt << concatenate( cdt, append to first table( 1 ) )
);
For( I = 1, i <= Ndoubled, i++, bigger );
col_lst = cdt << get column group( "Processes" );
Wait( 0 );
cdt << New Table Variable( "trigger update", 1 ); // can this be used to force an update?
cdt << begin data update();
t0 = HP Time();
If( dynamic,
col_lst = cdt << get column group( "Processes" );
For Each( {col}, col_lst,
col_Name = col << get name() || "_inSpecDynamic";
colnew = New Column( col_Name, Nominal );
col_Name = colnew << get name();
Eval(
Substitute(
Expr(
Column( col_Name ) << set Formula(
Local(
{t0 = As Constant(
dt = Current Data Table();
limits = _col_ << get property( "Spec Limits" );
nr = nrows(dt);
usl = limits["USL"];
lsl = limits["LSL"];
myRows = Where( _col_ > lsl & _col_ < usl );
NmyRows = N Items( myRows );
dt[0, _col_Name_] = J( nr, 1, 0 );
If( NmyRows,
dt[myRows, _col_Name_] = J( NmyRows, 1, 1 )
);
1
)},
Stop();
)
)
),
Expr( _col_ ), Name Expr( col ), Expr(_col_name_), col_name
)
);
cdt << move selected columns( {Column( col_name )}, after( col ) );
);
);
cdt << run formulas() << end data update();
Show( (HP Time() - t0) / 1000000 );
Wait( 0 );
Caption( "Process screening - don't dare ..." );
Stop();
// TEST THE RESULT
// check result in table visually
ps = cdt << Process Screening( Process Variables( Eval( col_lst ) ), Spec Limits Dialog( "No (skip columns with no spec limits)" ) );
ps << Color Out Of Spec Values( 1 );
ps << Close Window;
cdt << Clear Select << Clear Column Selection;
回复:Scripters Club 录音:提示和技巧Der @hogi ,感谢您查看代码和附加实现。对于演示,我没有过多考虑速度等,我的重点是展示不同的方式和方法。在现实生活中,最佳实现取决于您的边界条件,因此我认为这是针对具体情况的。
如果您查看程序流程,使用公式方法提取每行的规格限值可能并不理想,但在某些情况下它可能有用。但是 JMP 可能会在运行时内部改进程序,避免不必要的计算。我不可能知道所有这些细节,但这就是我们需要尝试不同方法的原因。
通常,当速度到位时,我会使用平台选项,例如通过流程筛选中的颜色,因为我认为它们针对大数据进行了优化。
也许我们可以在烘焙系列中再次研究它。是的,我再次认为 in_spec 将是一个非常好的内置函数。只有在关注所有细节时实现可能会变得困难 - 希望开发人员找到一个好的方法。
回复:Scripters Club 录音:提示和技巧为了与官方平台的性能进行比较,请删除或注释掉stop()。
回复:Scripters Club 录音:提示和技巧有一件事要记住,规格限制是单方面的规格。它们可能会导致各种有趣的问题
回复:Scripters Club 录音:提示和技巧是的,对。
为了简单起见,我认为使用双面规格是可以的。
考虑单侧规格(或没有任何规格的列)非常简单 - 但事实上,人们不应该忘记。
您有什么技巧可以加快计算速度并使其动态化吗?
回复:Scripters Club 录音:提示和技巧最有可能的是,它在很大程度上取决于正在解决的问题(因此解决方案在很大程度上取决于用例)。
回复:Scripters Club 录音:提示和技巧用例:
一个新列,其中包含一个公式,用于为超出规格/符合规格的值生成 0/1 值。
如果规格中有拼写错误,或者用户想要调整规格,则列的值应该自动更新(不应该停留在旧设置上)。
大概有10-30列。
10 万至 1000 万行。
该解决方案可以轻松地与想要使用 JMP 分析通过/失败信息的新同事共享。
回复:Scripters Club 录音:提示和技巧这可能有点题外:
您缺少一些规范(?)(我认为自己是专业的XY 问题解决者,但我并不认为您想成为其中的一员):
- 输入:只是一个数据表
- 使用所有设置了规格限制的列?
- 但请记住,这些可能设置不正确(我认为问题更大)
- 有多错误?我们能不能在两者上都找到缺失值?即使我们有连续测量,两者的值是否相同?或者只是“有缺陷”的值(以前,您可以在 JMP 中将“未评估”的值作为规格限值,但仍然显示为正确的数值。不确定 JMP18 是否仍然如此)。
- 单独的情况是用户可能想要调整这些(我认为这与 0/1 的单列用例不同)
- 用例是什么?我很确定用户不会从表格中直观地分析 30 列和 1000 万个单元格
- 他们如何使用结果?可以在那里进行计算吗?-> 有针对此类工作的自定义平台吗?
如果我要在这种情况下“解决问题” ,我首先会解决不正确的规格限制,或者更确切地说是规格限制被更改的情况。你真正想看到的是什么?当你有 1000 万行数据时,我真的怀疑是否有一个基于规格限制的 0/1 列。
您可以(或者我可以)创建一个功能来创建这样的列(不确定您可以做得有多快),但这真的是解决问题的办法吗?如果您只想根据所有列的当前规格限制获得 0/1 列,我认为它不必是动态的(立即更新)。用户可以按下菜单中的单个按钮来更新结果(我正在考虑使用特定列名或表变量的插件)。如果目的是调整规格,那么当您有 10 行时,看到 0 变为 1 是没有任何意义的(在我看来)(为该用例创建特殊平台,如果没有其他事情并且您“只”关心速度,它很可能会更快)。
或者这只是一个理论问题,如何让它快速?
回复:Scripters Club 录音:提示和技巧你好 Jarmo,谢谢你的评论。
您说得对,只需单击“单击此处更新”,所有问题就会消失。
但说实话,我喜欢“图形生成器——只需设置它,JMP就会处理细节”的方法。
无需通过社区讨论/实施细节(如何扩展公式以使其也适用于单侧规范是显而易见的)。在这里,我甚至更喜欢一个展示概念的简短代码。
除此之外,无需怀疑快速、动态且用户友好的:folded_hands:是否符合规格(价值)将用于一些有用的事情。
因此,直到:folded_hands:符合规格(值)可用为止——如果有人有更好的解决方案,如何手动设置,我会非常高兴并立即使用它。这不是一个理论问题:)