現在、さまざまな変数に対する制御および工程能力チャートを作成し、それをジャーナルに入れて、ジャーナルを PDF として保存するスクリプトがあります。問題は、スクリプトが 5000 行あり、冷凍庫の糖蜜よりも実行速度が遅いことです。そのため、作成するチャートの種類ごとに関数を定義し、そのようにしてそれらをつなぎ合わせる方が合理的だと考えました。制御チャートの関数は正常に作成できましたが、工程能力チャートを機能させることができません。
以下は、空港のサンプル データ (添付) を使用して、私が作成しようとしているグラフのようなグラフを作成するスクリプトです。
Process Capability(
Process Variables( :Flight ), // select column for data
Spec Limits( :Flight( LSL( 0 ), /*Target( 30 ),*/ USL( 20 ) ) ), //Spec limits, dont need target
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ), // hide unnecessary info
{:Flight << Process Capability Analysis(
Overall Sigma Capability( 1 ),
Within Sigma Capability( 1 ),
Histogram( 1, Show Target( 1 ), Show Within Sigma Density( 1 ), Show Overall Sigma Density( 1 ) )
)},
);列名を入力として関数を定義したいと思います。これまでのところ、次のようになっています。
capability_chart = function({variable, low, up},
Process Capability(
Process Variables( eval(variable) ), // select column for data
Spec Limits( eval(variable)(LSL( low ), /*Target( 30 ),*/ USL( up )) ),
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ), // hide unnecessary info
{column(dt, element) << Process Capability Analysis(
Overall Sigma Capability( 1 ),
Within Sigma Capability( 1 ),
Histogram( 1, Show Target( 1 ), Show Within Sigma Density( 1 ), Show Overall Sigma Density( 1 ) )
)}
)
);
capability_chart("Flight", 0, 10)これを実行すると、仕様限界を求めるウィンドウがポップアップ表示されます。スクリプトで仕様限界を自動的に入力するようにしたいです。仕様限界の行で、eval() の代わりに column() と ascolumn() を使用することも試みましたが、同じ結果になりました。理想的には、仕様テーブルを作成したり、仕様限界を列プロパティとして追加したりする必要はありませんが、他に方法がなければそうすることができます。また、レポートの既存の形式を変更すると混乱するため、すべての列をループして多数のプロセス能力チャートを作成したくありません。ご協力いただければ幸いです。
一度に1つの列のプロセス能力だけが必要な場合は、このような場合には配布プラットフォームを使用します。
Names Default To Here(1);
capability_chart = function({dt, colname, lowlimit, highlimit}, {Default Local},
dist = dt << Distribution(
Continuous Distribution(
Column(:Flight),
Quantiles(0),
Summary Statistics(0),
Histogram(0),
Vertical(0),
Outlier Box Plot(0),
Process Capability(LSL(lowlimit), Target(.), USL(highlimit))
)
);
return(dist);
);
dt = Open("$SAMPLE_DATA/Quality Control/Airport.jmp");
pc = capability_chart(dt, "Flight", 0, 10);
アウトライン ボックスにより、レポートが少し異なりますが、必要に応じてそれらを「非表示」にすることができます (または、関心のあるアウトライン ボックスをレポートに取り込むだけです)。

JSL 式を機能させるためのコツのリストを以下に示します。
JMP での式の処理: Tipps と Trapdoors
ヒント:
- ほとんどのプラットフォームは、列名 (= 参照、 :Flight ) に加えて、列名 (= 文字列、 "Flight" ) も受け入れます。:)
したがって、必要な唯一のトリックは、変数を列名 (文字列) に置き換えることです。
問題: ほとんどの場合、Jmp は関数を呼び出す前に引数を評価しません。したがって、関数の引数をEval()で囲んでも、評価には役立ちません。
-> すべてをEval(Eval Expr(())でラップし、 Eval()をExpr()に置き換えます。
... Jmp に最初に評価するように指示します。
capability_chart = function({variable, low, up},
Eval Expr(Process Capability(
Process Variables( Expr(variable), // select column for data
Spec Limits( Expr(variable)(LSL( low ), /*Target( 30 ),*/ USL( up )) ),
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ) // hide unnecessary info
))
));
capability_chart("Flight", 0, 10)
しかし、 Spec Limits("Flight"(LSL(low), Target(.), USL(up)))は機能しないので、次のように変換されます。
Spec Limits( :Flight << {LSL( low ), Target( .), USL( up )} )
それでは、 Name Expr(As column(列名)) を使ったトリックを試してみましょう。
Spec Limits(Expr(Name Expr(As column(variable)))(LSL( low ), Target( .), USL( up )) ),
...そして再び、次のようになります:
Spec Limits( :Flight << {LSL( low ), Target( .), USL( up )} )うわあ!…そしてああ!
そこで、常に機能するプランBを使用しましょう。Eval (Substitute())を使用します。
元のアイデア: 置換式としてName Expr(As column(column_name))と組み合わせる
...しかし、驚くべきことに、裸の文字列でも動作します(!):
capability_chart = function({variable, low, up},
Eval(Substitute(Expr(Process Capability(
Process Variables( _var_ ), // select column for data
Spec Limits( _var_(LSL( low ), /*Target( 30 ),*/ USL( up )) ),
Individual Detail Reports( 1 ),
Capability Box Plots( 0 ),
Goal Plot( 0 ),
Capability Index Plot( 0 ),
Process Performance Plot( 0 ) // hide unnecessary info
)),Expr(_var_), variable
)));
capability_chart("Flight", 0, 10)