您好,我遇到過將原始數據導入數據表(dt1),然後打開另一個具有規格限制(dt2)的數據表的情況。規格限值表只有 USL 和 LSL。我將一個新的計算列插入到 dt2 中,即目標規格限制(平均值(USL,LSL))。然後,我循環遍歷原始數據 dt1 的所有行,如果我得到測試名稱和規格限制的匹配項,則使用規格限制設置列屬性(例如,col << Set Property( "Spec Limits", { LSL( myLSLx ) ,USL( myUSLx ),目標( 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;
,
);
這是一個簡單的“堆積”評論。@tx尼爾森的公式將比您提供的公式更胖。列公式比 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;