Aiuto, il mio script funziona correttamente in una finestra script ma fallisce quando viene eseguito in una formula di colonnaCiao,
Ho creato uno script per riassumere una tabella di dati analizzando l'impatto statistico individuale di M fattori su N metriche.
La tabella riassuntiva mostra la matrice di N metriche (righe) con M fattori (colonne), con l'impatto specifico: spostamento medio, degradazione Cpk o entrambi)
Voglio aggiungere una funzionalità per tracciare la distribuzione per ogni riga selezionata con una formula di colonna.
Mi sono ispirato a questo post:
Collegare una cella (in una tabella JMP) a uno script?
Il problema è che il mio script funziona bene in una finestra Nuovo script con una riga selezionata fissa ([5] in questo esempio), ma poi fallisce quando includo lo script nella formula della colonna :Graph. Non capisco perché…
Potresti aiutarmi a risolvere questo problema?
Allegate 2 tabelle: datatable_test.jmp con i dati grezzi, Summary.jmp con la formula della colonna. L'idea è di cliccare sulla cella che si desidera tracciare nella colonna :Graph.
Attualmente l'errore mostra: :”Riferimento illegale (ricorsione) alla riga [ ]”

Quando eseguo lo script seguente con entrambe le tabelle aperte, funziona come previsto (vedere sotto). Ma lo script fallisce quando viene eseguito direttamente dalla tabella (fare clic sulla cella nella colonna Grafico).

Grazie mille in anticipo,
- Predicatore
// this script works from a Script window
// All features related to the column formula are commented
// here the row selected is row 5 : rn1 = [5]
Names Default To Here( 1 );
dt = Data Table( "datatable_test" );
dt2 = Data Table( "Summary" );
//If( Selected( Row State() ),
Eval(
Parse(
rn1 = [5]/*dt2 << get selected rows*/;
rn = rn1[1];
Factors = dt2 << get column names( "string" );
show(rn1, rn);
Eval(
Eval Expr(
For( i = N Items( Factors ), i >= 1, i--,
CurrCol = Column( dt2, Factors[i] );
If(Char( CurrCol[ rn ] ) == "Ok" | Factors[i] == "Metric"| Factors[i] == "Graph",
Remove From( Factors, i, 1 )
);
)
)
);
FactorA = "X( :" || Char( Factors[1] ) || ", Position( 1 ))";
FactorB = "X(1)";
For( j = 2, j <= N Items( Factors ), j++,
FactorA = Char( FactorA ) || ",X( :" || Char( Factors[j] ) ||
", Position( 1 ))";
FactorB = Char( FactorB ) || ",X( " || Char( j ) || " ) ";
);
Show( dt2:Metric[rn], FactorA, FactorB );
Key = dt2:Metric[rn];
Eval Insert(
" dt << Graph Builder(
Size( 534, 464 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables(
Y( ^Key^ ), ^FactorA^),
Elements( Box Plot( Y, Legend( 18 ), ^FactorB^ ) ),
SendToReport(
Dispatch(
{},
ScaleBox,
{Min( -0.485125992718803 ), Max( 5.53364268893602 ), Inc( 1 ),
Minor Ticks( 0 )}
)
)
) "
);
)
//)
);Automazione e scriptingR: Aiuto, il mio script funziona correttamente in una finestra script ma non riesce quando viene eseguito in una formula di colonnaC'è una ragione specifica per farlo con una formula di colonna? Ad esempio, avere una finestra personalizzata con box tabella e pulsanti sarebbe molto più facile da costruire e gestire. O forse usare un gestore di stato riga sulla tabella di riepilogo (anche se lo eviterei se possibile).
R: Aiuto, il mio script funziona correttamente in una finestra script ma non riesce quando viene eseguito in una formula di colonnaCiao Jarmo,
Non c'è una ragione specifica, ho semplicemente creato il mio script originale in questo modo, utilizzando una tabella dati per generare il riepilogo.
Non ci avevo pensato: aprire una casella di tabella e aggiungere pulsanti mi sembra una bella idea, potrei modificare la mia versione futura tenendolo a mente.
Ma nel frattempo, pensi che valga la pena far funzionare la formula della colonna? Così posso avere una versione funzionante più velocemente prima della prossima versione? Temo che cambiare la struttura per generare una casella tabella invece di una tabella dati mi richiederà un po' di tempo, dato che non ho ancora molta familiarità con la casella display/table.
Il pezzo di script che voglio includere nella formula Colonna funziona da solo, ma fallisce quando viene eseguito nella formula Colonna. Devo aver fatto qualcosa di sbagliato, ma non sono sicuro di cosa...
R: Aiuto, il mio script funziona correttamente in una finestra script ma non riesce quando viene eseguito in una formula di colonnaModificare:
In realtà ho scoperto che trasformare un tavolo in una scatola espositiva è stato facile:
nw = New Window("Report",
dt << Get As Report()
);Report generato di seguito

Non mi aspettavo che la formula funzionasse nel report, quando si clicca sulla riga (e non lo fa...).
Ma ora non sono sicuro di come suggeriresti di procedere con il tuo suggerimento.
(di nuovo, non ho ancora familiarità con la manipolazione delle caselle di visualizzazione)
grazie in anticipo
R: Aiuto, il mio script funziona correttamente in una finestra script ma non riesce quando viene eseguito in una formula di colonnaModifica 2:
Alla fine sono riuscito a far funzionare lo script, seguendo i consigli di Jarmo e questo post:
Aiuto JSL con: Ottieni come report e casella tabella
Ora quando clicco su una riga nel report, viene eseguito lo script in base alla riga selezionata, che è esattamente ciò di cui avevo bisogno:)

Script qui sotto, ha bisogno delle 2 tabelle aperte a cui ho partecipato nel mio primo messaggio
Grazie
- il predicatore
Names Default To Here( 1 );
dt7 = Data Table("Summary");
dt = Data Table("datatable_test");
dt7 << clear select;
dt7 << Clear Column Selection();
RptWin = New Window( "Data Table as report",
Outline Box("Data Table as Report",
dt7_Rpt = dt7 << Get as Report();
)
);
tb = dt7_Rpt[Table Box( 1 )];
tb << Set Heading Column Borders( 1 );
tb << Set Selectable Rows( 1 );
tb << Set Row Change Function(
Function( {this},
{SelRows},
SelRows = this << Get Selected Rows;
If(
N Items( SelRows ) > 1, Throw( "Too many items selected!\!rOnly one selection possible." ),
N Items( SelRows ) == 1,
SelRows = this << Get Selected Rows;
);
dt7 << Clear Select;
rn = dt7 << Select rows( SelRows ) << get selected rows;
show (rn[1], dt7:Metric[rn]);
Factors = dt7 << get column names( "string" );
Eval(
Eval Expr(
For( i = N Items( Factors ), i >= 1, i--,
CurrCol = Column( dt7, Factors[i] );
If(Char( CurrCol[ rn[1] ] ) == "Ok" | Factors[i] == "Metric"| Factors[i] == "Graph",
Remove From( Factors, i, 1 )
);
)
)
);
show (Factors);
Try(FactorA = "X( :" || Char( Factors[1] ) || ", Position( 1 ))");
FactorB = "X(1)";
For( j = 2, j <= N Items( Factors ), j++,
Try(FactorA = Char( FactorA ) || ",X( :" || Char( Factors[j] ) || ", Position( 1 ))");
FactorB = Char( FactorB ) || ",X( " || Char( j ) || " ) ";
);
Show( dt7:Metric[rn], FactorA, FactorB );
Key = dt7:Metric[rn];
If (Factors != {},
Eval(Parse(Eval Insert(
" dt << Graph Builder(
Size( 534, 464 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables(Y( ^Key^ ), ^FactorA^),
Elements(
Box Plot( Y, Legend( 18 ), ^FactorB^ ),
Caption Box(X, Y, Legend(20), Summary Statistic( \!"N\!" ),Location( \!"Graph per factor\!" ))),
SendToReport(
Dispatch(
{},
ScaleBox,
{Min( -0.485125992718803 ), Max( 5.53364268893602 ), Inc( 1 ),
Minor Ticks( 0 )}
)
)
) "
))),
Eval(Parse(Eval Insert(
" dt << Graph Builder(
Size( 534, 464 ),
Show Control Panel( 0 ),
Show Legend( 0 ),
Variables(Y( ^Key^ )),
Elements(
Box Plot( Y, Legend( 18 )),
Caption Box(Y, Legend(20), Summary Statistic( \!"N\!" ))),
SendToReport(
Dispatch(
{},
ScaleBox,
{Min( -7.06199976676385 ), Max( 26.8097086791615 ), Inc( 5 ),
Minor Ticks( 0 )}
)
)
) "
)))
)
));R: Aiuto, il mio script funziona correttamente in una finestra script ma non riesce quando viene eseguito in una formula di colonnaUn altro miglioramento che proverei a fare è sbarazzarmi di Eval(Parse()) (di solito rende lo script più facile da debuggare e non si imparano cattive abitudini). Ma ci vorrà un po' di impegno e tecniche diverse, quindi potresti lavorarci lentamente.
Posso anche darti un'occhiata tra circa 12 ore, così potrai farti un'idea di cosa potresti potenzialmente fare.
R: Aiuto, il mio script funziona correttamente in una finestra script ma non riesce quando viene eseguito in una formula di colonnaSono d'accordo. Farei un ulteriore passo avanti e sostituirei anche Eval Insert() .
Per quanto riguarda Eval(Parse()) - puoi semplicemente saltarlo:

Parse si aspetta una stringa come argomento.
Verrà valutata un'espressione e la stringa risultante verrà analizzata e restituita come espressione.
Parse(Print(1);"a"||"b")
COSÌ,
Parse(Print(1);Eval Insert(Graph Builder());"a")
stamperà 1, creerà il grafico e restituirà a come espressione. Se sei interessato solo alla parte centrale, puoi saltare Parse .
Anche l'associazione di Parse(Eval Insert()) con Eval() lo valuterà comunque.
D'altro canto, Eval(Eval Expr()) serve solo per valutare un Expr() presente all'interno.
Senza Expr() , è possibile rimuoverlo dal codice senza danni.
In generale, proporrei di pubblicare un codice basato su un set di dati dalla cartella Help/Sample Data.
Quindi il codice può essere eseguito immediatamente senza dover scaricare file da Internet.
Un ulteriore vantaggio: adattare il codice a diversi input spesso aiuta a comprendere il problema.
Spesso, quando ho il codice giusto per postare la domanda, la domanda scompare : )

R: Aiuto, il mio script funziona correttamente in una finestra script ma non riesce quando viene eseguito in una formula di colonnaSembra complicato (e lo è), ma è probabilmente così che lo affronterei (non è l'unico modo, puoi anche utilizzare << aggiungi variabili/<< aggiungi elementi)
Names Default To Here(1);
dt_summary = Open("$DOWNLOADS/Summary.jmp");
dt = Open("$DOWNLOADS/datatable_test.jmp");
dt << New Column("Ones", Numeric, Nominal, Set Each Value(1));
dt_summary << clear select;
dt_summary << Clear Column Selection();
possible_factors = dt_summary << get column names("string");
Remove From(possible_factors, Contains(possible_factors, "Metric"));
Remove From(possible_factors, Contains(possible_factors, "Graph"));
create_report = function({sel_row}, {Default Local},
valid_factor_idx = Loc(dt_summary[sel_row, possible_factors], "Ok");
valid_factors = possible_factors[valid_factor_idx];
key = dt_summary[sel_row, "Metric"];
If(N Items(valid_factors) == 0,
valid_factors = {"Ones"};
);
variables_expr = Expr(Variables());
bp_expr = Expr(Box Plot(Y, Legend(18)));
dt = dt; // JMP being JMP
For Each({valid_factor, idx}, valid_factors,
x_expr = EvalExpr(X(Expr(Name Expr(AsColumn(dt, valid_factor))), Position(1)));
Insert Into(variables_expr, Name Expr(x_expr));
Insert Into(bp_expr, Eval Expr(X(Expr(idx))));
);
y_expr = EvalExpr(Y(Expr(Name Expr(AsColumn(dt, key)))));
Insert Into(variables_expr, Name Expr(y_expr));
gb_expr = Substitute(
Expr(dt << Graph Builder(
Size(534, 464),
Show Control Panel(0),
Show Legend(0),
_variables_,
Elements(
_boxplot_,
Caption Box(X, Y, Legend(20), Summary Statistic("N"), Location("Graph per factor"))
),
SendToReport(
Dispatch({}, ScaleBox, {Min(-7.06199976676385), Max(26.8097086791615), Inc(5), Minor Ticks(0)})
)
)),
Expr(_variables_), Name Expr(variables_expr),
Expr(_boxplot_), Name Expr(bp_expr)
);
gb = Eval(gb_expr);
return();
);
nw = New Window("Data Table as report",
Outline Box("Data Table as Report",
summary_report = dt_summary << Get as Report();
)
);
report_tb = summary_report[Table Box(1)];
report_tb << Set Heading Column Borders(1);
report_tb << Set Selectable Rows(1);
report_tb << Set Row Change Function(Function({this},
selrows = this << Get Selected Rows;
If(N Items(selrows) > 1,
Throw("Too many items selected!\!rOnly one selection possible.")
);
create_report(selrows[1]);
));
Write();
Una volta che questo funziona, inizierei a pensare all'esperienza utente:
- Forse dovrei usare un pulsante che, se premuto, crei dei report per le righe selezionate?
- Posso consentire all'utente di selezionare più di una riga?
- In tal caso dovrei creare tutti i report nella stessa finestra?
- Se il grafico è già stato creato, devo ricrearlo?
- Quando l'utente chiude la finestra, devo chiudere anche le tabelle dati?
- ..
Vedi altro...Names Default To Here(1);
dt_summary = Open("$DOWNLOADS/Summary.jmp");
dt = Open("$DOWNLOADS/datatable_test.jmp");
dt << New Column("Ones", Numeric, Nominal, Set Each Value(1));
dt_summary << clear select;
dt_summary << Clear Column Selection();
possible_factors = dt_summary << get column names("string");
Remove From(possible_factors, Contains(possible_factors, "Metric"));
Remove From(possible_factors, Contains(possible_factors, "Graph"));
create_report = function({sel_row}, {Default Local},
valid_factor_idx = Loc(dt_summary[sel_row, possible_factors], "Ok");
valid_factors = possible_factors[valid_factor_idx];
key = dt_summary[sel_row, "Metric"];
If(N Items(valid_factors) == 0,
valid_factors = {"Ones"};
);
variables_expr = Expr(Variables());
bp_expr = Expr(Box Plot(Y, Legend(18)));
dt = dt; // JMP being JMP
For Each({valid_factor, idx}, valid_factors,
x_expr = EvalExpr(X(Expr(Name Expr(AsColumn(dt, valid_factor))), Position(1)));
Insert Into(variables_expr, Name Expr(x_expr));
Insert Into(bp_expr, Eval Expr(X(Expr(idx))));
);
y_expr = EvalExpr(Y(Expr(Name Expr(AsColumn(dt, key)))));
Insert Into(variables_expr, Name Expr(y_expr));
gb_expr = Substitute(
Expr(dt << Graph Builder(
Size(534, 464),
Show Control Panel(0),
Show Legend(0),
_variables_,
Elements(
_boxplot_,
Caption Box(X, Y, Legend(20), Summary Statistic("N"), Location("Graph per factor"))
),
SendToReport(
Dispatch({}, ScaleBox, {Min(-7.06199976676385), Max(26.8097086791615), Inc(5), Minor Ticks(0)})
)
)),
Expr(_variables_), Name Expr(variables_expr),
Expr(_boxplot_), Name Expr(bp_expr)
);
return(gb_expr);
);
nw = New Window("Data Table as report",
H List Box(
Outline Box("Data Table as Report",
summary_report = dt_summary << Get as Report();
),
Outline Box("Actions",
Button Box("Create Reports",
sel_rows = report_tb << Get Selected Rows;
lub_collector = Lineup Box(N Col(2));
For Each({selrow}, sel_rows,
lub_collector << Append(create_report(selrow));
);
nw_graphs = New Window("Graphs",
lub_collector
);
wait(0);
),
Button Box("Close Window", summary_report << close window);
)
)
);
report_tb = summary_report[Table Box(1)];
report_tb << Set Heading Column Borders(1);
report_tb << Set Selectable Rows(1);
I will edit and add images here if JMP Community ever lets me do it...
Edit: Images


R: Aiuto, il mio script funziona correttamente in una finestra script ma non riesce quando viene eseguito in una formula di colonnaGrazie mille Jarmo e Hogi.
Rispondo molto tardi, scusate il mio silenzio. Negli ultimi mesi ho dovuto concentrarmi su altre priorità, ma ora posso tornare a questo!
Ci rifletterò e proverò a seguire i tuoi suggerimenti.
Migliore,
-Predicatore