我目前有一個腳本,可以為各種變數建立控制和流程能力圖表,將其放入日記中,然後將日記儲存為 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)當我運行此程式時,會彈出一個窗口,提示我輸入規格限制。我希望我的腳本自動填充規格限制。我還嘗試在規範限制行中使用 column() 和 acolumn() 而不是 eval() ,但它們做了同樣的事情。理想情況下,我不必建立規格表或添加規格限製作為列屬性,但如果沒有其他方法,我可以這樣做。我也不想循環遍歷所有列並創建一堆流程能力圖表,因為報告的現有格式很難更改。任何幫助表示讚賞。
如果您當時只需要一列的流程能力,在這種情況下我會使用分發平台
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
提示:
- 大多數平台都接受列名稱(= string, "Flight" )以及列名稱(=reference, :Flight ):)
所以我們需要的唯一技巧是:用列名(字串)替換變數。
問題:在大多數情況下,Jmp 在呼叫函數之前不會評估參數。因此,如果將Eval()放在函數參數周圍,將無助於對其求值。
-> 將所有內容包裝在Eval(Eval Expr(())中,並將Eval()替換為Expr() s
……告訴 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(column name)) 的技巧:
Spec Limits(Expr(Name Expr(As column(variable)))(LSL( low ), Target( .), USL( up )) ),
……我們又得到:
Spec Limits( :Flight << {LSL( low ), Target( .), USL( up )} )哇! ...和arg!
所以,讓我們使用 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)