こんにちは、生データをデータ テーブル (dt1) にインポートしてから、仕様制限 (dt2) がある別のデータ テーブルを開くという状況に遭遇しました。仕様制限テーブルには、USL と LSL のみがあります。ターゲット仕様制限 (平均 (USL,LSL)) である dt2 に、新しい計算列を挿入します。次に、生データ dt1 のすべての行をループし、テストの名前と仕様制限が一致した場合は、仕様制限で列プロパティを設定します (例: col << Set Property( "Spec Limits", { LSL( myLSLx ),USL( myUSLx ),Target( mytargetx ), );)... 次に、スペック ファイル 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 のすべての関数とメッセージの完全な説明ではありませんが、2 番目の本は完全なはずです。 この 2 冊の本は、互いに補完し合い、一緒に使用することを目的としています。
このメッセージは、Scripting Index にも含まれており、ヘルプへのリンクも含まれています。 「フォーミュラ」を検索すると、<< Run Formulas および << Rerun Formulas メッセージを含むリストが返されます。
「再放送」も知らなかった。 必要かどうかに関係なく、式を再評価するように見えます。 数式で乱数を使用すると、違いがわかります。 ほとんどの場合、 <Re: 遅い列数式: 計算が完了するまで待つ方法ニース、これもうまくいきます。 数式の再実行は JMP V13 スクリプト ガイドにはありませんが、数式の実行は含まれています。 この場合、どちらも機能します。Re: 遅い列数式: 計算が完了するまで待つ方法素晴らしい! できます!Re: 遅い列数式: 計算が完了するまで待つ方法
以下は、あなたのために働くはずの簡単な変更です。まず、If() 句を取り除くことで処理が高速化されます。
dt << 数式を再実行します。
続行する前に、JMP に数式の処理を強制的に完了させます。
dt = Current Data Table();
dt << New Column( "_Target",
Numeric,
"Continuous",
Format( "Best", 12 ),
Formula( (:LSL + :USL) / 2 )
);
dt << rerun formulas;
テーブルに「式の実行」メッセージを送信してみてください。
dt << runFormulas;