我很快就介紹了 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);
另外在腳本的開頭。
我覺得我可以理解為什麼這會有用,但你對此有何看法?