同じループ内で既に値が割り当てられているセルに、For Each Row ループ内で値を割り当てるデータテーブルでFor Each Row関数を使用しています。この関数は、一連のIf文でいくつかの列の値を評価し、その結果に基づいて:Correct_Process列に値を割り当てます。
現在はこのように設定しています。
For Each Row(
dt,
If( :Module == "M05" & :Measurement == "Conductivity",
If(:Actual > m5_cond_hi | :Actual < m5_cond_low,
:Correct_Process = "Incorrect",
:Correct_Process = "Correct"
);
If( splits_detected == 1 & Contains( col_name_list, "PMC_FreeForm" ),
If( :PMC_FreeForm == "DI" | Contains(:PMC_FreeForm, "Mod 5 pump off"),
If( :Actual != 0,
:Correct_Process = "Incorrect",
:Correct_Process = "Correct"
);
);
);
If( splits_detected == 1 & Contains( col_name_list, "CPMC_Conductivity" ),
num_cond = Num(:CPMC_Conductivity);
lim_hi = num_cond + 0.6;
lim_low = num_cond - 0.6;
If( :Actual > lim_hi | :Actual < lim_low,
show("Evaluated Incorrect");
:Correct_Process = "Incorrect",
show("Evaluated Correct");
:Correct_Process = "Correct"
);
);
スクリプトを実行すると、:CPMC_Conductivity の値が「13.2」で、:Actual が13.5の場合でも、:Correct_Process 列には「Incorrect」という値が割り当てられます。興味深いことに、show() ステートメントによって、ログには「Evaluated Correct」と表示されますが、これは予想通りです。つまり、If ステートメントは正しく評価されているものの、:Correct_Process には「Correct」が割り当てられていないということです。
最初のネストされたif文でデフォルトで:Correct_Process列を割り当て、3番目のネストされたif文でより具体的なチェックで上書きしようとしているのが原因だと思います。しかし、このグループ内には、このチェックの後に同様のチェックがあり、他の条件(例えば2番目のネストされたif文)では正常に上書きできているようです。何か見落としている点があるのでしょうか。
自動化とスクリプトウィンドウズRe: For Each Row ループで既に値が割り当てられているセルに値を割り当てるループ内で同じセルの値を複数回上書きする理由はありますか?
Re: For Each Row ループで既に値が割り当てられているセルに値を割り当てるまた、サンプルデータセットを提供できますか?
すぐに確認すると、問題なく動作する
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
For Each Row(dt,
If(:height > 60,
Write("\!N", Row(), " 1: If");
:sex = "A";
,
Write("\!N", Row(), " 1: Else");
:sex = "B";
);
If(:weight > 70,
Write("\!N", Row(), " 2: If");
:sex = "AA";
,
Write("\!N", Row(), " 2: Else");
:sex = "BB";
);
);
また、<< Begin Data Update と << End Data Update も活用すると良いでしょう。
Re: For Each Row ループで既に値が割り当てられているセルに値を割り当てる最初の If() 関数の下にある 3 つの If() 関数は、それぞれ独立して実行されます。つまり、最初の If() 関数が True の場合、各行に対してそれぞれが評価されます。
JSLデバッガを使ってコードをステップ実行し、値が変化している箇所を探します。コードのロジックが期待通りに動作していない箇所が分かります。
サンプルデータテーブルを提供していただければ、コミュニティが問題をさらに深く掘り下げることができるかもしれません。
Re: For Each Row ループで既に値が割り当てられているセルに値を割り当てるいいえ、他の人のスクリプトを参考にして再構築しようとしていたのですが、なぜこのような結果になったのか分からず困惑していました。あなたの質問がきっかけでアイデアが浮かび、さらに詳しく調べてみたところ、スクリプトのこの部分は意図したとおりに動作していて、スクリプトの後半で上書きされていただけだったことがわかりました。 @txnelsonデバッガーを使って3回目の上書き箇所を探しました。ご提案ありがとうございます!