Ich habe derzeit ein Skript, das Kontroll- und Prozessfähigkeitsdiagramme für eine Vielzahl von Variablen erstellt, sie in ein Journal einfügt und das Journal dann als PDF speichert. Das Problem ist, dass mein Skript 5000 Zeilen lang ist und langsamer läuft als Melasse in einem Gefrierschrank. Daher dachte ich, es wäre sinnvoller, für jeden Diagrammtyp, den ich erstelle, eine Funktion zu definieren und sie auf diese Weise zusammenzufügen. Ich habe erfolgreich Funktionen für die Kontrolldiagramme erstellt, aber ich kann das Prozessfähigkeitsdiagramm nicht zum Laufen bringen.
Hier ist ein Skript, das die Flughafen-Beispieldaten (im Anhang) verwendet, um ein Diagramm zu erstellen, das dem ähnelt, das ich erstellen möchte:
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 ) )
)},
);Ich möchte eine Funktion mit dem Spaltennamen als Eingabe definieren. Hier ist, was ich bisher habe:
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)Wenn ich dies ausführe, wird ein Fenster angezeigt, in dem ich nach Spezifikationsgrenzen gefragt werde. Ich möchte, dass mein Skript die Spezifikationsgrenzen automatisch einträgt. Ich habe auch versucht, column() und ascolumn() anstelle von eval() in der Spezifikationsgrenzenzeile zu verwenden, aber sie haben dasselbe bewirkt. Idealerweise müsste ich keine Spezifikationstabelle erstellen oder Spezifikationsgrenzen als Spalteneigenschaft hinzufügen, aber ich kann das tun, wenn es keine andere Möglichkeit gibt. Ich möchte auch nicht alle Spalten durchlaufen und eine Reihe von Prozessfähigkeitsdiagrammen erstellen, da es ein vorhandenes Format für den Bericht gibt, dessen Änderung verwirrend wäre. Jede Hilfe ist willkommen.
Wenn Sie die Prozessfähigkeit nur für eine Spalte gleichzeitig benötigen, würde ich in solchen Fällen die Distribution Platform verwenden.
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);
Aufgrund der Gliederungsfelder wird Ihr Bericht etwas anders aussehen. Diese können jedoch bei Bedarf „ausgeblendet“ werden (oder Sie übernehmen einfach das Gliederungsfeld, das Sie interessiert, in Ihren Bericht).

Hier ist eine Liste mit Tricks, um einen JSL-Ausdruck zum Laufen zu bringen:
Ausdrucksbehandlung in JMP: Tipps und Falltüren
Hinweise:
- die meisten Plattformen akzeptieren den Spaltennamen (= string, "Flight" ) zusätzlich zum Spaltennamen (=reference, :Flight ):)
Der einzige Trick, den wir brauchen, besteht darin, die Variable durch den Spaltennamen (Zeichenfolge) zu ersetzen.
Das Problem: In den meisten Fällen wertet Jmp ein Argument nicht aus, bevor es die Funktion aufruft. Wenn Sie also Eval() um das Funktionsargument herum einfügen, hilft es nicht bei der Auswertung.
-> Packen Sie alles in ein Eval(Eval Expr(()) und ersetzen Sie Ihre Eval() s durch Expr() s
... um Jmp anzuweisen, sie zuerst auszuwerten.
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)
aber die Spec Limits("Flight"(LSL( low ), Target( . ), USL( up )) ) funktioniert nicht, es wird umgewandelt in
Spec Limits( :Flight << {LSL( low ), Target( .), USL( up )} )
Versuchen wir also den Trick mit Name Expr(As column(column name)):
Spec Limits(Expr(Name Expr(As column(variable)))(LSL( low ), Target( .), USL( up )) ),
... und wieder erhalten wir:
Spec Limits( :Flight << {LSL( low ), Target( .), USL( up )} )wow! ... und arg!
Verwenden wir also Plan B, der immer funktioniert: Verwenden Sie Eval(Substitute())
Die ursprüngliche Idee: in Kombination mit Name Expr(As column(column_name)) als Ersetzungsausdruck
... aber fast überraschend funktioniert es sogar mit der blanken Saite (!):
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)