我很快就介绍了 JMP 脚本编写的一些提示和技巧JMP 脚本编写者俱乐部第二季度。
我的技术解释可能不正确,并且我可能会到处使用错误的术语,因为我不太愿意理解一切(仅大多数)JMP 和 JSL 发生了什么,我只是希望我的代码能够运行良好且快速。
Tip1 启用 JMP 脚本编辑器的嵌入日志
启用嵌入式日志使您可以直接在 JMP 的脚本编辑器中快速轻松地查看 JMP 日志。 您可以从脚本编辑器下的 JMP 首选项启用嵌入式日志。 JMP16 还允许您更改嵌入日志的高度(我个人使用 25%-30% 之间的值)。

也许有用的链接
JMP 中的文本登录(jmp.com 帮助)
提示2 对于 JMP16+ 启用增强日志
JMP16 发布了名为“增强日志”的新功能。 这会跟踪您在 JMP 中以交互方式完成的操作,并为这些操作提供脚本,让 JMP 更轻松地为您编写脚本。
可以从 JMP 的首选项中启用增强日志。 您还可以对捕获的内容以及增强日志的外观进行修改。

也许有用的链接
增强型日志和操作记录器 - JMP 16 和 JMP Pro 16 中的新增功能
JMP 16 中的增强日志:这改变了一切
增强的 JMP 登录 (jmp.com)
Tip3 评估从变量到表达式的值
这是 JMP 社区中相当常见的主题:例如,为什么变量的值没有被评估为公式。 这基本上意味着这些值没有从表达式(变量)“出来”进行计算。 下面是演示问题和可能的解决方案的示例(我的首选方法是 Eval(EvalExpr()) + Expr())。
例1 公式
在此示例中,将创建两列,一列不带 Eval(EvalExpr()),一列带 Eval(EvalExpr())。 没有的留下的是公式中的变量名
查看更多...
数据表和公式(注意公式的样子以及 x 到 3 的值发生了什么(现在它们是 4 的幂))

如果您要保存此数据表,重新打开它并添加新行,您将收到以下错误消息,因为数据表不知道幂的值是什么。

这是因为我使用的是 Names Default To Here(1);在示例脚本中,但在这种情况下,错误是一件好事。 如果我没有使用“Names Default To Here(1)”;开始我的脚本(参见额外小费),我会将 power 变量添加到全局命名空间,并且数据表仍然会知道同一 JMP 会话中的 power 值。 现在,我可能认为我的数据表按预期工作,并且我去共享该表,而我将其共享给谁都会想知道为什么它不起作用。
示例2 设置规格限制
此示例脚本演示了如何使用 Eval(EvalExpr()) 将值获取到列属性(在本例中为规格限制)。
查看更多...
Names Default To Here(1);
// Create demo table
dt = New Table("Demo",
Add Rows(6),
New Column("Label", Character, "Nominal", Set Values({"A", "A", "A", "B", "B", "B"})),
New Column("x", Numeric, "Continuous", Format("Best", 12), Set Values([1, 2, 3, 4, 5, 6])),
New Column("y1", Numeric, "Continuous",
Set Values(
[0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262, 0.685370508348569]
)
),
New Column("y2", Numeric, "Continuous",
Set Values(
[0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262, 0.685370508348569]
)
),
New Column("y3", Numeric, "Continuous",
Set Values(
[0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262, 0.685370508348569]
)
)
);
Column(dt, "y1") << Set Property(
"Spec Limits",
{LSL(-1), USL(1), Show Limits(1)}
);
lower_limit = 0.5;
upper_limit = 1.5;
Column(dt, "y2") << Set Property(
"Spec Limits",
{LSL(lower_limit), USL(upper_limit), Show Limits(1)}
);
Eval(
EvalExpr(
Column(dt, "y2") << Set Property(
"Spec Limits",
{LSL(Expr(lower_limit)), USL(Expr(upper_limit)), Show Limits(1)}
);
)
);
名称默认为此处(1); // 创建演示表 dt = New Table("Demo", Add Rows(6), New Column("Label", Character, "Nominal", Set Values({"A", "A", "A", " B", "B", "B"})), 新列("x", 数字, "连续", 格式("最佳", 12), 设置值([1, 2, 3, 4, 5, 6])), 新列("y1", 数字, "连续", 设置值( [0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.11494858865626 2, 0.685370508348569] ) ), 新列("y2", 数字, "连续",设置值( [0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262, 0.685370508348569] ) ), 新列("y3", 数字, "连续", 设置值( [0.540628764079884, 0.0138843499589711, 0.363861175486818, 0.697015449637547, 0.114948588656262, 0. 685370508348569])) ); Column(dt, "y1") << 设置属性( "规格限制", {LSL(-1), USL(1), 显示限制(1)} );下限=0.5;上限=1.5; Column(dt, "y2") << 设置属性( "规格限制", {LSL(lower_limit), USL(upper_limit), 显示限制(1)} ); Eval( EvalExpr( Column(dt, "y2") << 设置属性( "规格限值", {LSL(Expr(lower_limit)), USL(Expr(upper_limit)), 显示限值(1)} ); ) );
示例3 << 关闭时
作为最后一个示例,我将演示如何保护脚本不被意外覆盖引用。 我在2022_Q1 MakeOverChallenge:以各种方式单击鼠标的操作挑战B
如果运行此脚本并关闭双变量窗口,您会注意到正在关闭的是 Semiconductor Capability 表而不是 Big Class。 这是因为当双变量窗口关闭时,dt 已经引用了 Semiconductor Capability(也可以使用不同的变量名称,例如 dt_semi)
查看更多...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
biv = dt << Bivariate(Y(:Weight), X(:Height), Nonpar Density);
biv << On Close(
close(dt, no save)
);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
名称默认为此处(1); dt = Open("$SAMPLE_DATA/Big Class.jmp"); biv = dt << 双变量(Y(:重量), X(:高度), 非标准密度); biv << 关闭时( 关闭(dt, 不保存) ); dt = Open("$SAMPLE_DATA/半导体能力.jmp");
如果您运行此代码,正确的表将被关闭。 这是因为我们正在评估对 Big Class 表的引用 << On close 语句
查看更多...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
biv = dt << Bivariate(Y(:Weight), X(:Height), Nonpar Density);
Eval(EvalExpr(
biv << On Close(
Close(Expr(biv << Get Data Table), no save)
);
));
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
名称默认为此处(1); dt = Open("$SAMPLE_DATA/Big Class.jmp"); biv = dt << 双变量(Y(:重量), X(:高度), 非标准密度); Eval(EvalExpr( biv << On Close( Close(Expr(biv << 获取数据表), 不保存) ); )); dt = Open("$SAMPLE_DATA/半导体能力.jmp");
也许有用的链接
使用 Eval Insert、Eval Expr、Parse 和 Substitute 将一个表达式插入另一个表达式
表达式处理函数:第一部分 - 解析 Expr()、NameExpr()、Eval() 等 难题
表达式(JMP 帮助、jmp.com)
表达式函数(JMP 帮助、jmp.com)
额外提示 使用“默认名称”(Names Default To Here)(1) 启动脚本;
这将保护您免受全局变量污染命名空间的影响,并避免日后出现问题。这是我在启动新脚本文件时总是做的事情,即使我要使用自定义命名空间。 我这样做是为了避免在全局命名空间中意外创建变量。
也许有用的链接
高级范围和命名空间(JMP 帮助、jmp.com) (非常好的读物,它有多个页面,请务必检查其中的大部分!)
名称解析规则(JMP 帮助、jmp.com)
提高效率和可重复性的基本脚本:少做多做 (2019-US-TUT-290)
如果我看到它,由于以下原因,我倾向于将其删除/注释掉@唐麦考马克
你好@雷塞尔,
我同意@唐麦考马克,最好不要清除全局变量。 您不想这样做的一个例子可能是当您的脚本中有“调用”功能时,您可以单击“调用”按钮,然后单击您已转换为角色或值的任何变量或列。输入用于 JMP 平台的数据会自动替换,您无需返回并手动执行此操作。 如果您在脚本开头有明确的全局变量(1),则每次运行脚本时,您的调用变量将从内存中清除,从而有效地使调用函数变得无用。
DS
@雷塞尔,我个人会避免使用 Clear Globals(1),因为它可能会干扰其他可能正在运行的脚本。 将任何脚本变量的范围限制在本地或它们自己的命名空间会更安全。
关于
Names default to here (1);
我还看到有人用
Clear globals (1);
另外在脚本的开头。
我觉得我可以理解为什么这会有用,但你对此有何看法?