我确实很快介绍了一些关于 JMP 脚本的提示和技巧JMP Scripters Club Q2 . 以下是文本形式的相同提示(还有更多)。 我的技术解释可能不正确,而且我可能会到处使用错误的术语,因为我不太想理解一切(仅大多数)JMP 和 JSL 发生了什么,我只希望我的代码能够快速运行。
Tip1 启用 JMP 脚本编辑器的嵌入式日志
启用嵌入式日志可让您直接在 JMP 的脚本编辑器中快速轻松地查看 JMP 日志。 您可以从脚本编辑器下的 JMP 首选项启用嵌入式日志。 JMP16 还允许您更改嵌入式日志的高度(我个人使用 25%-30% 之间的值)。

也许有用的链接
JMP 中的文本登录(jmp.com 帮助)
Tip2 对于 JMP16+ 启用增强日志
随着 JMP16 的发布,新功能被称为增强日志。 这可以跟踪您在 JMP 中以交互方式完成的操作,并为这些操作提供脚本,让 JMP 为您编写脚本变得更加容易。
可以从 JMP 的首选项中启用增强日志。 您还可以对捕获的内容和增强日志的外观进行修改。

也许有用的链接
增强的日志和操作记录器 - JMP 16 和 JMP Pro 16 中的新功能
JMP 16 中的增强型日志:这改变了一切
JMP (jmp.com) 中的增强型登录
Tip3 计算从变量到表达式的值
这是 JMP 社区中相当常见的话题:例如,为什么变量的值没有被评估为公式。 这基本上意味着这些值没有被“从”表达式(变量)中评估出来。 以下是演示问题和可能解决方案的示例(我的首选方法是 Eval(EvalExpr()) + Expr())。
Example1 公式
在此示例中,将创建两列,一列没有 Eval(EvalExpr()),也有 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]
)
)
);
power = 3;
new_col = dt << New Column("x to " || char(power), Numeric, Continuous, Formula(:x^power));
Show(new_col << Get Formula);
power = 4;
Eval(EvalExpr(new_col = dt << New Column("x to " || char(power), Numeric, Continuous, Formula(:x^Expr(power)))));
Show(new_col << Get Formula);
数据表和公式(注意公式的外观以及 x 到 3 值发生了什么变化(它们现在是 4 的幂))

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

这是因为我使用的 Names Default To Here(1);在示例脚本中,但在这种情况下错误是一件好事。 如果我没有使用 Names Default To Here(1);开始我的脚本(见额外小费),我会将 power 变量添加到全局命名空间,并且数据表仍将知道同一 JMP 会话中的 power 值。 现在我可能会认为我的数据表按预期工作,我去共享表,我共享它的人会想知道为什么它不工作。
示例 2 设置规格限
此示例脚本演示了如何使用 Eval(EvalExpr()) 将值获取到列属性中(在本例中为 Spec Limits)。
查看更多...
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)}
);
)
);
示例 3 << 关闭时
作为最后一个示例,我将演示如何保护脚本不被意外覆盖引用。 我在短文中谈到了这个2022_Q1 MakeOverChallenge:以各种方式对鼠标单击进行操作挑战 B
如果您运行此脚本并关闭双变量窗口,您会注意到半导体能力表正在关闭,而不是 Big Class。 这是因为当双变量窗口关闭时,dt 已经在引用半导体能力(也可以使用不同的变量名,例如 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");
如果您运行此代码,正确的表将被关闭。 这是因为我们正在评估 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");
也许有用的链接
使用 Eval Insert、Eval Expr、Parse 和 Substitute 将一个表达式插入另一个表达式
表达式处理函数:第一部分 - 解开 Expr()、NameExpr()、Eval()、... 难题
表达式(JMP 帮助、jmp.com)
表达式函数(JMP 帮助,jmp.com)
额外提示 使用默认为此处的名称启动您的脚本(1);
这将保护您免受全局变量污染命名空间并避免出现问题。这是我在启动新脚本文件时总是做的事情,即使我要使用自定义命名空间。 我这样做是为了避免在全局命名空间中意外创建变量。
也许有用的链接
高级范围和命名空间(JMP 帮助,jmp.com) (很好读,它有多个页面,请务必检查大部分!)
解析名称的规则(JMP 帮助、jmp.com)
提高效率和可重复性的基本脚本:少做多做 (2019-US-TUT-290)
关于
Names default to here (1);
我也看到有人用
Clear globals (1);
另外在脚本的开头。
我觉得我能理解为什么这会有用,但您对此有何看法?
@Ressel ,我个人会避免使用 Clear Globals(1),因为它可能会干扰可能正在运行的其他脚本。 将任何脚本变量的范围限定在本地或它们自己的命名空间中会更安全。
你好@Ressel ,
我同意@DonMcCormack ,最好不要清除全局变量。 您不想这样做的一个示例可能是当您的脚本中有“召回”功能时,您可以单击“召回”按钮,然后单击您已转换为角色或值的任何变量或列已输入用于 JMP 平台的内容会自动替换,您无需返回手动执行此操作。 如果您在脚本开始时有 clear globals(1),则每次运行脚本时,您的召回变量都会从内存中清除,从而有效地使召回功能无用。
DS