for ループが意図したとおりに動作しないこんにちは、
非常にややこしい問題が 2 つあります。
1) 以下の単純な for ループでは、1 つの出力に対して満たされる条件が 3 つあります。手動で調べてグラフを作成することで、8 つの組み合わせすべてが実際にデータ内に存在することを確認しました。ただし、これは偏った結果となり、X1 列のすべてのセルに x1、x2、x3 のみが入力されます。たとえば、エントリ x2 には、2 倍の数のエントリが割り当てられます。サブセットを介してさらに検査すると、A1、B1、および C1 列が x2 と x4 の両方で実際に満たされており、等しいシェアになります。すべての列は同じデータとモデリング タイプを共有します。
また、何が起こるかを確認するために、2 倍のエントリを集めているエントリをブロックしました。次に、エントリは、たとえば x2 にバンドルされます。
For( i = 1, i <= N Rows ( dt ), i++,
If( :A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x1";
:A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x2";
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x3";
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x4";
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x3";
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x4";
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x1";
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x2";
);
);
2) & を使用してセルに値を代入してコードを短縮すると、「L 値ではないオブジェクトに代入しようとしています」というエラーが発生します。これはコードを短縮し、複数の異なるループを持たないようにする試みです。以下は 3 つの基準と 3 つの出力の例です。
For( i = 1, i <= N Rows ( dt ), i++,
If( :A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x1" & :Y1[i] = "y1" & :Z1[i] = "z2";
:A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x2" & :Y1[i] = "y3" & :Z1[i] = "z3";
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x3" & :Y1[i] = "y2" & :Z1[i] = "z1";
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x4" & :Y1[i] = "y4" & :Z1[i] = "z4";
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x3" & :Y1[i] = "y1" & :Z1[i] = "z1";
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x4" & :Y1[i] = "y2" & :Z1[i] = "z4";
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x1" & :Y1[i] = "y4" & :Z1[i] = "z2";
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x2" & :Y1[i] = "y3" & :Z1[i] = "z3";
);
);
ご指導いただければ幸いです。事前にご協力いただきありがとうございます。
品質およびプロセスエンジニアリングRe: for ループが意図したとおりに動作しないまた、コード内で列名が正しく呼び出されていることを確認し、行末にコンマとセミコロンの両方を試しました。 コードを小さなチャンクに分割し、列 A1 の可能な値を異なる for ループに分割しましたが、同じ問題があります。
Re: for ループが意図したとおりに動作しないやあ@スターフルーツボブ、
あなたは近くにいます...
の構文if 関数If( 条件 1、結果 1、条件 2、結果 2、そうでなければ結果 ) です。
したがって、末尾のセミコロンをコンマに置き換えてステートメントを作り直します。
For( i = 1, i <= N Rows ( dt ), i++,
If(
// condition 1 = :A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c1"
// result 1 = :X1[i] = "x1" & :Y1[i] = "y1" & :Z1[i] = "z2"
:A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x1" & :Y1[i] = "y1" & :Z1[i] = "z2"
,
:A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x2" & :Y1[i] = "y3" & :Z1[i] = "z3"
,
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x3" & :Y1[i] = "y2" & :Z1[i] = "z1"
,
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x4" & :Y1[i] = "y4" & :Z1[i] = "z4"
,
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c1", :X1[i] = "x3" & :Y1[i] = "y1" & :Z1[i] = "z1"
,
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c2", :X1[i] = "x4" & :Y1[i] = "y2" & :Z1[i] = "z4"
,
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c1", :X1[i] = "x1" & :Y1[i] = "y4" & :Z1[i] = "z2"
,
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c2", :X1[i] = "x2" & :Y1[i] = "y3" & :Z1[i] = "z3"
);
);
HTH。
乾杯、
スタン
Re: for ループが意図したとおりに動作しないスタンさん、こんにちは。
迅速な返信ありがとうございます。これは私がすでに実験したものであり、たとえば、x1、x2、および x3 の入力の代わりに、x1、x2、および x4 が入力されます。
これは、列 X1 と Y1 などの複数の出力でも発生します。
Re: for ループが意図したとおりに動作しないはい、スタンが提案するように必ずコンマを使用してください。 秘密の場合
編集:あなたが欲しいと思います
If( :A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c1" , :X1[i] = "x1" ,
:A1[i] == "a1" & :B1[i] == "b1" & :C1[i] == "c2" , :X1[i] = "x2" ,
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c1" , :X1[i] = "x3" ,
:A1[i] == "a1" & :B1[i] == "b2" & :C1[i] == "c2" , :X1[i] = "x4" ,
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c1" , :X1[i] = "x3" ,
:A1[i] == "a2" & :B1[i] == "b1" & :C1[i] == "c2" , :X1[i] = "x4" ,
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c1" , :X1[i] = "x1" ,
:A1[i] == "a2" & :B1[i] == "b2" & :C1[i] == "c2" , :X1[i] = "x2" ,
throw("Nothing matched!") // this is the otherwise case
);
本当に複数の割り当てが必要な場合は、; を使用します。それよりも &
:X1[i] = "x1" & :Y1[i] = "y1" & :Z1[i] = "z2" // change this
:X1[i] = "x1"; :Y1[i] = "y1"; :Z1[i] = "z2"; // to this
うまくいくかもしれませんが、非常に壊れやすく、次の人がパズルを解くのは非常に困難です. あなたが言うように、コンパイラは見ます
a=1 & b=2
なので
a = ( ( 1 & b ) = 2 )
L値メッセージを生成します。 エラーメッセージがプログラマーの代弁でなかったらいいのに「1 & b」は変数名ではないため、= の右側の値 2 を = の左側の「1 & b」に格納できません。 .
実際、コンパイラは a=1 & b=2 に対してかなり良い仕事をします:
'Assign' のアクセスまたは評価で、L 値ではないオブジェクトに代入しようとすると、1 & b = /*###*/2 /*###*/
Re: for ループが意図したとおりに動作しないこれは文字通り、このすべての中で2回目の試みであり、週末に再び戻ってきて、うまくいきました.このように初めて試したときになぜうまくいかなかったのかについての説明はありません。ご回答ありがとうございます。