您好,我遇到了將原始數據導入數據表 (dt1),然後打開另一個具有規格限制 (dt2) 的數據表的情況。規格限製表只有一個 USL 和一個 LSL。我將一個新的計算列插入到 dt2 中,即目標規格限制(平均值(USL,LSL))。然後,我遍歷原始數據 dt1 的所有行,如果我得到測試名稱和規範限制的匹配項,則使用規範限制設置列屬性(例如 col << Set Property("Spec Limits", { LSL(myLSLx),USL(myUSLx),Target(mytargetx),);)... 然後關閉spec文件dt2,不保存。
我認為我遇到的問題是計算列(dt2:_Target)不夠快,並且在創建新計算列(“_Target”...)之後嘗試讀取它們時得到所有空值。如果我保持 dt2 文件打開,我會在計算列“_Target”中看到正確的值。我玩過 dt2<< Begin data Update;這也不起作用,但也許我把它放在腳本中的錯誤位置?我唯一的解決方法是不對新列使用公式,而是在腳本中計算目標值並通過索引所有行將其放入規範文件中。
我的問題的根源是,在嘗試讀取行/列中的特定值之前,我可以等待所有列都完成計算嗎?
不工作
例如,
New Column( "_Target",Numeric,"Continuous",Format( "Best", 12 ),Formula(If( Is Missing( :_LSL ) | Is Missing( :_USL ),
Empty(),
Mean( :_LSL, :_USL )
)
解決方法
例如,
dt2 = current data table();
New Column( "_Target", Numeric, "Continuous");
dt2_rows = nrows();
for (i=1, i<=dt2_rows, i++,
if(or(!is missing(dt2:_LSL[i]),!is missing(dt2:_USL[i])),
dt2:_Target[i] = ((dt2:_LSL[i]) + (d2t:_USL[i])) / 2;
,
);
這是一個簡單的“堆積”評論。@txnelson的公式會比你提供的更胖。列公式比 for 循環運行得更快。 此外,不需要條件語句,因為 JMP 在任何具有空值的計算中都會返回一個 empty()。 因此, (:USL + :LSL)/2 如果任何一個或兩個值為空,則將為空。
這只是一個僅供參考。
您是正確的,腳本指南中沒有描述此消息。 它在 JSL 語法指南中進行了描述。 第一本書不是對 JSL 中每個函數和消息的完整描述,但第二本書應該是完整的。 這兩本書旨在相互補充並一起使用。
該消息也包含在腳本索引中,並帶有指向它的幫助鏈接。 搜索“公式”將返回一個列表,其中包括 << 運行公式和 << 重新運行公式消息。
也不知道“重播”。 看起來它使公式重新評估,無論他們是否需要。 如果您在公式中使用隨機數,您可以看到差異。 在大多數情況下,我會推薦 <回复:列公式變慢:如何等到它們完成計算不錯,這也有效。 重新運行公式不在 JMP V13 腳本指南中,而運行公式在。 在這種情況下,兩者都有效。回复:列公式變慢:如何等到它們完成計算驚人的! 有用!回复:列公式變慢:如何等到它們完成計算
下面是一個簡單的修改,應該適合你。首先,通過去掉 If() 子句,它將加快處理速度,其次,
dt << 重新運行公式;
將強制 JMP 在繼續之前完成對公式的處理
dt = Current Data Table();
dt << New Column( "_Target",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( (:LSL + :USL) / 2 )
);
dt << rerun formulas;