Creazione di un grafico di Pareto interattivo con riquadri di scorrimento interattivi per aggiornare la formula della colonnaHo una serie di specifiche che un prodotto in produzione dovrebbe superare. Ho una colonna con una formula che specifica i valori necessari (Limiti) da ciascuna specifica e crea un pass/fail binario. Questa formula viene utilizzata per creare un grafico di Pareto di numero e percentuale di passaggio. Voglio creare un grafico di Pareto interattivo con caselle di scorrimento per regolare i limiti del test e vedere come la modifica di questi limiti cambierebbe la quantità di elementi che superano/falliscono il test.
I miei due problemi principali sono i seguenti:
1) Ci sono diversi tipi di prodotto che verranno testati. Non avrò un numero consistente di specifiche per prodotto, quindi ho intenzione di inserire queste specifiche in un elenco (nel codice allegato che sarebbe "spec") e di utilizzare una tabella di dati esterna per compilare tali specifiche per il prodotto desiderato. Questo non è qualcosa per cui ho bisogno di aiuto, ma è qualcosa da considerare poiché dovrò inserire caselle di scorrimento, caselle numeriche e così via in un ciclo for senza fare riferimento direttamente alle variabili.
2) Ho bisogno di una matrice di variabili (limiti delle specifiche) in modo da poter aggiornare la formula a scopo di test. Ancora una volta questo dovrà essere in un ciclo for. Allo stato attuale dello script, sembra che i valori dei limiti delle specifiche non stiano aggiornando la formula per la colonna pass/fail. Quando la casella di scorrimento riceve il comando << inval e il grafico si aggiorna, non accade nulla poiché la colonna pass/fail effettiva non viene aggiornata. Attualmente sto utilizzando un array associativo per memorizzare i limiti delle specifiche. Questo potrebbe non essere il modo corretto per farlo.
Ho allegato la tabella dei dati di esempio che sto utilizzando e lo script corrente. Grazie!
Names default to here(1);
RangeMin = Associative array(["m1" => 0,
"m2" => 0,
"m3" => 0,
"thickness" => 0]);
RangeMax = Associative array(["m1" => 1,
"m2" =>1,
"m3" => 1,
"thickness" => 20]);
limit = Associative array(["m1" => 0.5,
"m2" => 0.5,
"m3" => 0,
"thickness" => 4]);
SliderVars = {0.5,0.5,0.5,10};
spec = {"m1","m2","m3","thickness"};
GraphingTable = current data table();
finalDisplay = New Window ("test", testlist = h list box());
:name("Pass/Fail") << Set Formula(
if((:thickness >= limit["thickness"] & :m3 >= limit["m3"] & m2 >= limit["m2"] & m1 >= limit["m1"]), "Pass", "Fail" )
);
PP= Graphing Table << Pareto Plot( Cause( :"Pass/Fail"n ) );
ValuesOutlineBox = Outline Box ( "Values", SliderList = v list box());
For(i=1, i<= n items(spec),i++,
SliderList << append(
h list box(
Text box(spec[i]),
testing = spec[i];
eval(
parse(
eval insert(
"Var^char(i)^ = ^SliderVars[i]^;
SB^char(i)^ = Slider Box(
^RangeMin << get value(spec[i])^,
^RangeMax << get value(spec[i])^,
Var^char(i)^,
NEB^char(i)^ << set( Var^char(i)^ );
limit[testing] = Var^char(i)^;
testlist[2] << Delete Box();
wait(0.1);
testlist << append(report(PP));
);"
);
);
),
testing = spec[i];
eval(
parse(
eval insert(
"NEB^char(i)^ = Number Edit Box( Var^char(i)^,
<< set function(
Function( {this},
Var^char(i)^ = this << get;
SB^char(i)^ << inval;
limit[testing] = Var^char(i)^;
testlist[2] << Delete Box();
wait(0.1);
testlist << append(report(PP));
)
)
);"
);
);
),
)
)
);
testlist << append(ValuesOutlineBox);
testlist << append(report(PP));Qualità e ingegneria di processofinestreRi: Creazione di un grafico di Pareto interattivo con riquadri di scorrimento interattivi per aggiornare la formula della colonnaNon sembra cambiare l'array delle specifiche. Questo è quello che ho pensato all'inizio anch'io. Tuttavia sono stato in grado di fare riferimento alle singole caselle all'interno della V List Box.Apprezzo il tuo aiuto come sempre.
Ri: Creazione di un grafico di Pareto interattivo con riquadri di scorrimento interattivi per aggiornare la formula della colonnaGrazie! Buon esempio.
Ri: Creazione di un grafico di Pareto interattivo con riquadri di scorrimento interattivi per aggiornare la formula della colonnaPenso che i valori dovrebbero essere salvati salvati nell'array associativo delle specifiche quando li cambi. Ma potresti anche provare a salvare i riferimenti alle caselle di modifica dei numeri in un elenco o in un altro array associativo. O forse puoi usare XPath (o qualche altro mezzo per viaggiare nella struttura ad albero) per ottenere quei riferimenti quando ne hai bisogno.
Ri: Creazione di un grafico di Pareto interattivo con riquadri di scorrimento interattivi per aggiornare la formula della colonnaMi sono imbattuto in un altro problema con questo script e speravo di ottenere i tuoi pensieri. Se inserisco manualmente un numero nella casella di modifica del numero per le specifiche, desidero aggiungere un pulsante per poter salvare le specifiche in un'altra tabella. L'aggiunta del pulsante non è un problema, ma non so come potrò fare riferimento ai valori correnti delle caselle di modifica del numero. Dopo per ogni funzione, vengono aggiunti alla casella di riepilogo V e tali valori vengono aggiornati nella colonna della formula. Ma senza un modo per fare riferimento ai valori della casella di modifica del singolo numero o la possibilità di memorizzare quei numeri e inserirli in una struttura dati separata con un riferimento alla specifica, non so come posso salvare questi nuovi limiti nello script. Il riferimento alla casella di riepilogo new_control H mostrerà solo l'ultima casella che ha attraversato il ciclo for each. Qualsiasi pensiero o suggerimento sarebbe fantastico.
Ri: Creazione di un grafico di Pareto interattivo con riquadri di scorrimento interattivi per aggiornare la formula della colonnaSecondo il supporto di JMP, lo sviluppo di JMP lo ha ritenuto un comportamento non intenzionale e verrà risolto in una versione futura.
Ri: Creazione di un grafico di Pareto interattivo con riquadri di scorrimento interattivi per aggiornare la formula della colonnaGrazie. Se senti qualcosa sul problema del Range Slider Box, sarei molto interessato a vedere.
Ri: Creazione di un grafico di Pareto interattivo con riquadri di scorrimento interattivi per aggiornare la formula della colonnaUserei Range Slider Box, ma sembra non funzionare correttamente con l'array associativo e l'elenco come quarto argomento (invierò un'e-mail per supportare domani su questo). Quindi tornerei alle scatole Slider.
Questo ora utilizza l'espressione della formula e le caselle a doppio cursore (è abbastanza facile interrompere script come questo che dipendono dai nomi delle variabili in Windows, quindi potresti dover aggiungere spazi dei nomi o qualcos'altro per quelli)
Names Default To Here(1);
//declare associative array for specs
specs = Associative Array();
//open limits file in JMP
LimitsTable = open("vinyl data limits.jmp", invisible);
//set testing data to be able to manipulate in JMP
GraphingTable = open("Vinyl Data.jmp");
//Select the Specs you want to compare by using a COL LIST BOX
ListNumericCols = GraphingTable << Get Column Names(numeric);
nw = New Window("Select Wanted Specifications", << Modal, << return result,
clb = Col List Box (<< Set Items (ListNumericCols))
);
ListSpecNames = nw["clb"];
show(ListSpecNames);
//insert spec names into associative array
for (i=1,i< (N Items(ListSpecNames) + 1), i++,
Insert Into(specs, ListSpecNames[i]);
ColSpec = Column(LimitsTable, 1); //1 is the coolumn for spec name
LimitList= {};
//Insert Lower Limit onto
for(j=1, j < (nrows(LimitsTable)+1), j++,
if (ColSpec[j] == ListSpecNames[i],
ColLimit = Column(LimitsTable, 2);//2 is the column for lower limit
MinVal = 0;
if(ColLimit[j] > 0, MinVal = ColLimit[j] / 2, MinVal = ColLimit[j]*2);
InsertInto(LimitList, MinVal );
break();
));
for(k=1, k < (nrows(LimitsTable)+1), k++,
if (ColSpec[k] == ListSpecNames[i],
ColLimit = Column(LimitsTable, 2);//2 is the column for lower limit
InsertInto(LimitList, ColLimit[k]);
break();
));
for(l=1, l < (nrows(LimitsTable)+1), l++,
if (ColSpec[l] == ListSpecNames[i],
ColLimit = Column(LimitsTable, 3);//3 is the column for lower limit
InsertInto(LimitList, ColLimit[l]);
break();
));
for(m = 1, m < (nrows(LimitsTable)+1), m++,
if (ColSpec[m] == ListSpecNames[i],
ColLimit = Column(LimitsTable, 3);//3 is the column for upper limit
MaxVal = 0;
if(ColLimit[m] > 0, MaxVal = ColLimit[m] *2, MaxVal = ColLimit[m] /2 );
InsertInto(LimitList, MaxVal );
break();
)
);
show (LimitList);
specs[ListSpecNames[i]] = LimitList
);
//show(specs); for debugging and making sure specs array is being populated
//sel_specs = Associative Array(ListSpecNames);
//specs << Intersect(sel_specs);
//*******************************************************************
//Create Pass Fail column if not existing.
if(!contains(GraphingTable << Get Column Names("String"), "Pass/Fail"),
GraphingTable << new column("Pass/Fail", Character);
);
//using a string to insert a formula into the row that can be called upon dynamically
formula_expr = Expr(
f = "If(All(";
For Each({{spec, limits}}, specs,
f ||= Eval Insert("^limits[2]^ < :^spec^ < ^limits[3]^ & ");
);
//drop last &
f = Left(f, Length(f) - 3);
f ||= "),"; // close all
f ||= "\!N\!t\!"PASS\!",\!"FAIL\!"
)";
Eval(EvalExpr(Column(GraphingTable, "Pass/Fail") << Set Formula(
Expr(Parse(f));
)));
);
formula_expr;
nw2 = New Window("test", testlist = H List Box(
ValuesOutlineBox = Outline Box("Values", SliderList = V List Box()),
Graphing Table << Pareto Plot(Cause(:"Pass/Fail"n))
));
For Each({{spec_name, spec_list, idx}}, specs,
new_control = H List Box(
Text Box(spec_name),
rsb = Slider Box(spec_list[1], spec_list[4]),
Number Edit Box(spec_list[2], << Set Minimum(spec_list[1]), << Set Maximum(spec_list[4]), << Set Function(function({this},
(this << Prev Sib) << Set(this << get);
formula_expr;
)))
);
Eval(EvalExpr(rsb << Set Var(specs[Expr(spec_name)][2])));
rsb << Set Function(function({this},
(this << sib) << Set(this << Get, Run Script(1));
));
SliderList << Append(new_control);
);
For Each({{spec_name, spec_list, idx}}, specs,
new_control = H List Box(
Text Box(spec_name),
rsb = Slider Box(spec_list[1], spec_list[4]),
Number Edit Box(spec_list[2], << Set Minimum(spec_list[1]), << Set Maximum(spec_list[4]), << Set Function(function({this},
(this << Prev Sib) << Set(this << get);
formula_expr;
)))
);
Eval(EvalExpr(rsb << Set Var(specs[Expr(spec_name)][3])));
rsb << Set Function(function({this},
(this << sib) << Set(this << Get, Run Script(1));
));
SliderList << Append(new_control);
);
Esempio del problema:
Names Default To Here(1);
var1 = 1;
var2 = 2;
var3 = 2;
var4 = 1;
aa = ["low" => 1, "up" => 2];
l = {};
l[1] = 1;
l[2] = 2;
nw = New window("test",
rsb1 = Range Slider Box(1, 2, var1, var2, Show(1)),
rsb2 = Range Slider Box(1, 2, aa["low"], aa["up"]),
rsb2_1 = Range Slider Box(1, 2, aa["low"], var3),
rsb1_2 = Range Slider Box(1, 2, var4, aa["up"]),
rsb3 = Range Slider Box(1, 2, l[1], l[2]),
);
Show(rsb1 << Get Lower Var, rsb1 << Get Upper Var);
Show(rsb2 << Get Lower Var, rsb2 << Get Upper Var);
Show(rsb2_1 << Get Lower Var, rsb2_1 << Get Upper Var);
Show(rsb1_2 << Get Lower Var, rsb1_2 << Get Upper Var);
Show(rsb3 << Get Lower Var, rsb3 << Get Upper Var);
Eval(EvalExpr(rsb3 << Set Lower Var(Expr(Expr(l[1])))));
Eval(EvalExpr(rsb3 << Set Upper Var(Expr(Expr(l[2])))));
Show(rsb3 << Get Lower Var, rsb3 << Get Upper Var);
Ri: Creazione di un grafico di Pareto interattivo con riquadri di scorrimento interattivi per aggiornare la formula della colonnaPensi che funzionerebbe meglio avere due caselle di scorrimento, una per il limite superiore e una per il limite inferiore di ciascuna specifica rispetto alla gestione degli argomenti delle caselle di scorrimento dell'intervallo? I test di ieri hanno prodotto molti più problemi con le caselle di scorrimento dell'intervallo con molta meno documentazione sugli argomenti del tipo di scatola. Penso che risolverebbe il problema del range box, ma potrebbe complicare la parte della formula.
Ri: Creazione di un grafico di Pareto interattivo con riquadri di scorrimento interattivi per aggiornare la formula della colonnaPer la formula hai almeno due opzioni: puoi usare l'espressione per aggiornare il valore nella formula che esegui ogni volta che le specifiche vengono aggiornate o modificare la formula per utilizzare l'array associativo delle specifiche
f = "If(All(";
For Each({{spec, limits}}, specs,
f ||= Eval Insert("specs[\!"^spec^\!"][2] < :^spec^ < specs[\!"^spec^\!"][3] & ");
);
//drop last &
f = Left(f, Length(f) - 3);
f ||= "),"; // close all
f ||= "\!N\!t\!"PASS\!",\!"FAIL\!"
)";
Range Slider Box è persino più disordinato di Slider Box, quindi risolvere i problemi con questa è una sfida più grande. Molto probabilmente non mi preoccuperei nemmeno di Eval(EvalExpr()) e userei semplicemente Eval(Parse()) e proverei a ottenere riferimenti corretti lì. Inizierei solo con Ranger Slider Box e dopo averli fatti funzionare aggiungerei Number Edit Boxes uno alla volta (il quarto argomento di Range Slider Boxes potrebbe essere un po 'buggy ...)
Ri: Creazione di un grafico di Pareto interattivo con riquadri di scorrimento interattivi per aggiornare la formula della colonnaApprezzo molto l'aiuto che mi hai dato negli ultimi giorni. Ho lavorato attraverso le tue soluzioni a questo e al mio altro post, Avere un aggiornamento della formula di colonna basato su un array associativo a cui fa riferimento un elenco.
Ho esaminato e cercato di elaborare le espressioni parse ed eval e sto capendo come funziona in jsl. Ho un problema con la combinazione delle due idee. Mi sono reso conto che sarebbe stato meglio avere 4 indici nell'array associativo per memorizzare le specifiche. Nel formato "spec" => {, , , }. Grazie al tuo aiuto con l'analisi, lo script qui sotto ora crea questo array e una colonna Pass/Fail per vedere se tutte le specifiche sono soddisfatte. L'obiettivo è quello di allentare le tolleranze nei limiti, fino alle tolleranze minime o massime per ottenere il nuovo tasso di rendimento passante desiderato del prodotto e aggiornare il grafico di Pareto come fissato sopra. Ho provato a implementare una casella di scorrimento dell'intervallo, poiché sarebbe più intuitiva per rilassare le tolleranze sui limiti, ma ho problemi. Interrompe anche l'aggiornamento automatico della trama di Pareto come prima.
Credo che un problema potrebbe essere che poiché la stringa "f" viene inizialmente definita, non penso che verrà aggiornata per le future esecuzioni dell'impostazione della formula per la colonna pass fail. Qualsiasi modo in cui potresti essere in grado di aiutare sarebbe molto apprezzato.
Names Default To Here(1);
//declare associative array for specs
specs = Associative Array();
//open limits file in JMP
LimitsTable = open("vinyl data limits.jmp", invisible);
//set testing data to be able to manipulate in JMP
GraphingTable = open("Vinyl Data.jmp");
//Select the Specs you want to compare by using a COL LIST BOX
ListNumericCols = GraphingTable << Get Column Names(numeric);
nw = New Window("Select Wanted Specifications", << Modal, << return result,
clb = Col List Box (<< Set Items (ListNumericCols))
);
ListSpecNames = nw["clb"];
show(ListSpecNames);
//insert spec names into associative array
for (i=1,i< (N Items(ListSpecNames) + 1), i++,
Insert Into(specs, ListSpecNames[i]);
ColSpec = Column(LimitsTable, 1); //1 is the coolumn for spec name
LimitList= {};
//Insert Lower Limit onto
for(j=1, j < (nrows(LimitsTable)+1), j++,
if (ColSpec[j] == ListSpecNames[i],
ColLimit = Column(LimitsTable, 2);//2 is the column for lower limit
MinVal = 0;
if(ColLimit[j] > 0, MinVal = ColLimit[j] / 2, MinVal = ColLimit[j]*2);
InsertInto(LimitList, MinVal );
break();
));
for(k=1, k < (nrows(LimitsTable)+1), k++,
if (ColSpec[k] == ListSpecNames[i],
ColLimit = Column(LimitsTable, 2);//2 is the column for lower limit
InsertInto(LimitList, ColLimit[k]);
break();
));
for(l=1, l < (nrows(LimitsTable)+1), l++,
if (ColSpec[l] == ListSpecNames[i],
ColLimit = Column(LimitsTable, 3);//3 is the column for lower limit
InsertInto(LimitList, ColLimit[l]);
break();
));
for(m = 1, m < (nrows(LimitsTable)+1), m++,
if (ColSpec[m] == ListSpecNames[i],
ColLimit = Column(LimitsTable, 3);//3 is the column for upper limit
MaxVal = 0;
if(ColLimit[m] > 0, MaxVal = ColLimit[m] *2, MaxVal = ColLimit[m] /2 );
InsertInto(LimitList, MaxVal );
break();
)
);
show (LimitList);
specs[ListSpecNames[i]] = LimitList
);
//show(specs); for debugging and making sure specs array is being populated
//sel_specs = Associative Array(ListSpecNames);
//specs << Intersect(sel_specs);
//*******************************************************************
//Create Pass Fail column if not existing.
if(!contains(GraphingTable << Get Column Names("String"), "Pass/Fail"),
GraphingTable << new column("Pass/Fail", Character);
);
//using a string to insert a formula into the row that can be called upon dynamically
f = "If(All(";
For Each({{spec, limits}}, specs,
f ||= Eval Insert("^limits[2]^ < :^spec^ < ^limits[3]^ & ");
);
//drop last &
f = Left(f, Length(f) - 3);
f ||= "),"; // close all
f ||= "\!N\!t\!"PASS\!",\!"FAIL\!"
)";
Eval(EvalExpr(Column(GraphingTable, "Pass/Fail") << Set Formula(
Expr(Parse(f));
)));
nw2 = New Window("test", testlist = H List Box(
ValuesOutlineBox = Outline Box("Values", SliderList = V List Box()),
Graphing Table << Pareto Plot(Cause(:"Pass/Fail"n))
));
filler = {};
For Each({{spec_name, spec_list, idx}}, specs,
new_control = H List Box(
Text Box(spec_name),
Range Slider Box(spec_list[1], spec_list[4] , spec_list[2], spec_list[3], << Set Function(function({this},
(this << Sib) << Set(this << get, run Script(1));
))) ,
Number Edit Box(spec_list[2], << Set Minimum(spec_list[1]), << Set Maximum(spec_list[4]), << Set Function(function({this},
(this << Prev Sib) << Set(this << get);
specs[((this << parent) << child) << get text][2] = this << get;
Column(GraphingTable, "Pass/Fail") << Eval Formula;
))),
Number Edit Box(spec_list[3], << Set Minimum(spec_list[1]), << Set Maximum(spec_list[4]), << Set Function(function({this},
(this << Prev Sib) << Set(this << get);
specs[((this << parent) << child) << get text][3] = this << get;
Column(GraphingTable, "Pass/Fail") << Eval Formula;
)))
);
SliderList << Append(new_control);
);
Ri: Creazione di un grafico di Pareto interattivo con riquadri di scorrimento interattivi per aggiornare la formula della colonnaGrazie mille! Questa è la mia seconda settimana di scripting in JSL e non hai idea di quanto mi hai aiutato.
Ri: Creazione di un grafico di Pareto interattivo con riquadri di scorrimento interattivi per aggiornare la formula della colonnaIl codice è abbastanza pesantemente modificato e non sono sicuro al 100% di quanto sarà affidabile, ma userei set function e child/sib/parent per ottenere riferimenti corretti relativi alle caselle di scorrimento. Anche pareto sembra essere aggiornato quando il valore della formula si aggiorna. Questo potrebbe trarre vantaggio da un certo utilizzo di Eval(EvalExpr())
Names Default To Here(1);
specs = Associative Array();
specs["m1"] = {0, 0.5, 1};
specs["m2"] = {0, 0.5, 1};
specs["m3"] = {0, 0, 1};
specs["thickness"] = {0, 4, 20};
GraphingTable = Current Data Table();
Column(GraphingTable, "Pass/Fail") << Set Formula(
If((:thickness >= specs["thickness"][2] & :m3 >= specs["m3"][2] & m2 >= specs["m2"][2] & m1 >= specs["m1"][2]),
"Pass",
"Fail"
)
);
nw = New Window("test", testlist = H List Box(
ValuesOutlineBox = Outline Box("Values", SliderList = V List Box()),
Graphing Table << Pareto Plot(Cause(:"Pass/Fail"n))
));
filler = {};
For Each({{spec_name, spec_list, idx}}, specs,
new_control = H List Box(
Text Box(spec_name),
Slider Box(spec_list[1], spec_list[3], 0, << Set Function(function({this},
(this << Sib) << Set(this << get, run Script(1));
))),
Number Edit Box(spec_list[2], << Set Minimum(spec_list[1]), << Set Maximum(spec_list[3]), << Set Function(function({this},
(this << Prev Sib) << Set(this << get);
specs[((this << parent) << child) << get text][2] = this << get;
Column(GraphingTable, "Pass/Fail") << Eval Formula;
)));
);
SliderList << Append(new_control);
);
Nel tuo codice sembra che potresti mancare ^ intorno ai test per ottenere i valori nell'array associativo limite aggiornato.