forループで数式列を作成する不適合コードの不適合率を計算し、ユーザーが入力した日付範囲にわたって各コードの管理図を作成するスクリプトがあります。ユーザーは5つまでの個々のコードを入力することができ、選ぶべき50以上のコードがあります。日付ごとのコードごとの不適合数量の合計、入力されたすべてのコードの不適合数量の合計、および1日あたりの製造数量の合計(コードごとの日付ごとのNCレート - オリジナル)を含むテーブルが作成されます。次に、ループを繰り返して各コードの非確認率を計算する列を追加し、次にその率をパーセントで表示するコードを追加してテーブルに追加します(コードごとの日付別のNC率 - 完了)。 現時点では、すべての単価列が同一の割合で表示されていますが、事前パーセント列も同様ですが、正しいパーセント値ではありません。
このループは基本的にスクリプトの最後に作成されたものと同じで、日付範囲全体の不適合データ(コードあたりの全体のNCレート - 元、コードあたりの全体のNCレート - 完了)を要約します。何が悪いのか教えてください。
私はmetonionedテーブルとスクリプトセクションのスクリーンショットを添付しました(codes =文字列としてのすべての入力されたコードのリスト、SDとNRはテーブル参照です)
//NC Rate By Date Per Code Section
//Calculate NC rates and percentages for entered codes if two or more codes are entered
If(NItems(codes)>=2,
For(c=2, c<=NItems(codes)+1, c++,
//Add NC Rate column for each code
NR<<NEW column="">=2,
For(c=2, c<=NItems(codes)+1, c++,
//Add NC Rate column for each code
SD<<NEW column=""></NEW></NEW>Forループで数式列を作成する @ rfeick 、
最後の2つの列と、forループ内で作成された列の公式には違いがあります。最後の2列は実際の列を参照して計算を行います。
forループ仕様によって作成されたいくつかの列式を見てください(下記参照)。
NR<<NEW column=""></NEW>
式は次のようになります。cの値はないため、取得した結果はcの最終値の結果になります。
<SPAN class="token function">Round</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token punctuation">(</SPAN><SPAN class="token function">Column</SPAN><SPAN class="token punctuation">(</SPAN>c<SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">[</SPAN><SPAN class="token punctuation">]</SPAN> <SPAN class="token operator">/</SPAN> <SPAN class="token punctuation">:</SPAN>Manufactured Qty<SPAN class="token punctuation">)</SPAN><SPAN class="token punctuation">,</SPAN> <SPAN class="token number">4</SPAN><SPAN class="token punctuation">)</SPAN>
このテーブルを保存して後で新しいJMPセッションで開き、それらの列が空になる式を再実行すると、JMPはcの値を認識しません。
式の代わりにcの値を代入する式を使用するように式を変更するか、計算値を格納するようにスクリプトを変更する必要があります。以下のコードは、式ではなく値を格納するためにSet Each Value()を使用する方法を示しています。
tcol = NR<<NEW column=""></NEW>
Forループで数式列を作成する、説明してくれてありがとう。Set Each Rowメソッドを試したところ、1日あたりの不適合率を計算するときに見られていた問題が修正されました。私がまだ混乱している1つの点は、スクリプトの1つのセクションで同じ理論がどのように機能したが、他のセクションでは機能しなかったということです。再:Forループでの数式列の作成しゅう 、
以下のスクリプトは、JMP14で数式列で変数を使用すると、変数の値が変更されると数式(およびその値)が変更されるため、誤った結果が生じる可能性があることを理解するのに役立ちます。
スクリプトの最後の2つの式について:
説明に従って、以下のスクリプトを実行します。これは、テーブルの式で発生していること、つまり値を示しています。このスクリプトには、式を使用して式の変数を変数の値で置き換えるメソッドも含まれています。 通常、Set Each Value()を使用するため、ソース列が削除されても列はそのままです。 また、このスクリプトは c 列番号。数式を埋め込む場合は、新しい変数を作成することをお勧めします cnme = Column(c)<<名前を取得 、次にColumn(cnme)と式を使用します。その後、テーブルが再編成された場合など。式は予想どおりです(そのまま)。以下に表示されるスクリプトが添付されています。
Names Default to Here(1);
dt = Open("$Sample_Data/Big Class.jmp");
//will create formula columns for height and weight using a relative column number , c
//c will change, simulating a loop.
//highlight the blocks of code and follow the instructions
//--- Block 0: run this to embed the log window
_cw = Current Window();
_ifb = _cw << Find( If Box( 1 ) );
wait(0);
_ifb << Set( 1 );
//--- end Block 0
//--- Block 1: run it and look at the look at the embedded log
c=4; //height
dt << New Column( (column(c) << get name) ||" per age", Numeric, Continuous, Formula(Round(column(c)[] /:age,2) ) );
nc1 = ncol(dt);
show( c, nc1, (column(nc1) << get formula), column(nc1)[1::5]);
//--- end Block 1
//--- Block 2: run it and look at the look at the embedded log
c=5; //weight
dt << rerun formulas;
nc1 = ncol(dt);
show( c, nc1, (column(nc1) << get formula), column(nc1)[1::5]);
//--- end Block 2 See the log, the formula is the same, but c has changed so the formula is now using column 5 (c=5)
// for its calculation
//--- Block 3: run it and look at the look at the log
c=5; //height
dt << New Column( (column(c) << get name) ||" per age", Numeric, Continuous, Formula(Round(column(c)[] /:age,2) ) );
nc2 = ncol(dt);
show( c, nc2, (column(nc2) << get formula), column(nc2)[1::5]); //same formula as nc1
show(column(nc1)[1::5], column(nc2)[1::5]);
//--- end Block 3
//will use formula columns for weight and height using expressions column number
//--- Block 4: run it and look at the look at the log
c=4; //height
Eval ( Eval Expr(
dt << New Column( (column(c) << get name) ||" per age using expr", Numeric, Continuous, Formula(Round(column(expr(c))[] /:age,2) ) )
));
nc3 = ncol(dt);
show( c, nc3, (column(nc3) << get formula), column(nc3)[1::5]);
//--- end Block 4 - note the formula now has the exact column number, it no longer relies on "c"
//--- Block 5: run it and look at the look at the log
c=5; //height
Eval(EvalExpr(
dt << New Column( (column(c) << get name) ||" per age using expr", Numeric, Continuous, Formula(Round(column(Expr(c))[] /:age,2) ) );
));
nc4 = ncol(dt);
show( c, nc4, (column(nc4) << get formula), column(nc4)[1::5]); //not the same formula as nc3,
show(column(nc3)[1::5], column(nc4)[1::5]);
//--- end Block 5
Re:forループで数式列を作成する詳しい説明ありがとうございます!