Pick File()関数を使ってファイルのリストを取得しようとしています。
ファイルのリストをループして、スタックを実行したい各ファイルごとに、スタック・データ表の列から統計を計算し、その計算値を使用して既存のデータ表を更新します。
(ファイルのリストは製造ロットのリストであり、製造ロットの平均、標準偏差、およびCPKの傾向を示すスクリプトを作成しようとしています)
1つのファイルだけを見ても上記の手順はうまくいきますが、複数のファイルを試してみるとうまくいかないようです。 ファイルをループ処理するforループは一度だけ実行されます。 show(i == NItems(lst))ステートメントを配置しましたが、ループの条件が満たされていないことも示されています。
以下は、問題のforループの抜粋です。
get_lst_loop = Function({files},
Local({tmp,lst,dt,dt_stack},
Try(
tmp = {};
For(i=1,i<=NItems(files),i++,
show(i==NItems(files));
dt = Open(files[i],Invisible);
dt_stack = bRay_stack(dt);
lst = get_lst(dt_stack,"Data");
Close(dt_stack,NoSave);
Close(dt,NoSave);
Insert Into(tmp,lst)
);
,
Throw("Error in making analysis matrix: "||char(exception_msg));
);
Return(Eval List(tmp));
);
);この記事の残りの部分といくつかのテストファイルを添付します。
私はこれを回避するためにいくつかの異なることを試みましたが、何も働いていないようです。
私が試みていることを達成するためのより良い方法があるならば、私に知らせてください。
関数定義に関連したローカル変数を明示的に定義することは可能ですが(そして時には便利なことですが)、一般的にはすべての変数を関数定義に対してローカルなものとして扱うほうがずっと好ましいと思います。 このようにして、for-loop変数が誤ってグローバルになってしまうような状況に陥ることはありません。 次の構文を使用して、すべての変数をローカルに宣言できます。
foo = function( {}, {Default Local},
// implement function here e.g.
for (i=1,i<=10,i++,
// do something
);
return(somevalue);
);念のために、スクリプトのどこに問題があるのかを突き止めました。 おそらく誰かがこれがなぜ起こるのかについてもっと詳しく述べることができます。
エラーは私のforループの私のインクリメント変数のスコープの問題によるものと思われます。
インクリメント変数としてすべて同じ "i"を使用していたforループを複数使用していました。 各ループが固有の増分変数を持つように変更することにより( "fi"、"lst_i"のように)