Ayuda, mi script se ejecuta correctamente en una ventana de script, pero falla cuando se ejecuta en una fórmula de columnaHola,
Creé un script para resumir una tabla de datos analizando el impacto estadístico individual de M factores en N métricas.
La tabla resumen muestra la matriz de N métricas (filas) con M factores (columnas), con el impacto específico: cambio de media, degradación de Cpk o ambos)
Quiero agregar una función para trazar la distribución de cada fila seleccionada con una fórmula de columna.
Me inspiré en este post:
¿Cómo vincular una celda (en una tabla JMP) a un script?
El problema es que mi script funciona bien en una ventana de script nuevo con una fila seleccionada fija ([5] en este ejemplo), pero luego falla cuando incluyo el script en la fórmula de la columna :Graph. No entiendo por qué…
¿Podrías ayudarme a depurar esto?
Se adjuntan 2 tablas: datatable_test.jmp con los datos sin procesar, Summary.jmp con la fórmula de la columna. La idea es hacer clic en la celda que se desea representar gráficamente en la columna :Graph.
Actualmente el error muestra: “Referencia ilegal (recursión) en la fila [ ]”

Cuando ejecuto el siguiente script con ambas tablas abiertas, funciona como se esperaba (ver a continuación). Pero el script falla cuando se ejecuta directamente desde la tabla (haga clic en la celda de la columna Gráfico).

Muchas gracias de antemano,
- Predicador
// 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 )}
)
)
) "
);
)
//)
);Automatización y scriptingRe: Ayuda, mi script se ejecuta correctamente en una ventana de script, pero falla cuando se ejecuta en una fórmula de columna¿Existe una razón específica para hacer esto con una fórmula de columna? Por ejemplo, sería mucho más fácil crear y administrar una ventana personalizada con un cuadro de tabla y botones. O tal vez usar un controlador de estado de fila en una tabla de resumen (aunque yo evitaría eso si es posible).
Re: Ayuda, mi script se ejecuta correctamente en una ventana de script, pero falla cuando se ejecuta en una fórmula de columnaHola jarmo,
No hay ninguna razón específica, simplemente creé mi script original de esta manera, usando una tabla de datos para generar el resumen.
No pensé en eso: abrir un cuadro de tabla y agregar botones parece una buena idea, podría modificar mi futura versión con eso en mente.
Pero mientras tanto, ¿crees que vale la pena hacer que funcione la fórmula de la columna? ¿Así puedo tener una versión que funcione más rápido antes de la próxima versión? Me temo que cambiar la estructura para generar un cuadro de tabla en lugar de una tabla de datos me llevará algo de tiempo, ya que aún no estoy muy familiarizado con la visualización/cuadro de tabla.
El fragmento de código que quiero incluir en la fórmula de la columna funciona por sí solo, pero falla cuando se ejecuta en la fórmula de la columna. Debo haber hecho algo mal, pero no estoy seguro de qué...
Re: Ayuda, mi script se ejecuta correctamente en una ventana de script, pero falla cuando se ejecuta en una fórmula de columnaEditar:
De hecho, descubrí que convertir una mesa en un cuadro de exhibición era fácil:
nw = New Window("Report",
dt << Get As Report()
);Informe generado a continuación

No esperaba que la fórmula funcionara en el informe, al hacer clic en la fila (y no funciona...).
Pero ahora no estoy seguro de cómo sugerirías proceder con tu sugerencia.
(de nuevo, todavía no estoy familiarizado con la manipulación del cuadro de visualización)
gracias de antemano
Re: Ayuda, mi script se ejecuta correctamente en una ventana de script, pero falla cuando se ejecuta en una fórmula de columnaEdición 2:
Finalmente logré que el script funcionara, siguiendo la recomendación de Jarmo y este post:
Ayuda con JSL: Obtener como informe y cuadro de tabla
Ahora, cuando hago clic en una fila del informe, se ejecuta el script en función de la fila seleccionada, que es exactamente lo que necesitaba.:)

El script a continuación necesita las 2 tablas abiertas a las que me uní en mi primer mensaje.
Gracias
- el predicador
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 )}
)
)
) "
)))
)
));Re: Ayuda, mi script se ejecuta correctamente en una ventana de script, pero falla cuando se ejecuta en una fórmula de columnaOtra mejora que intentaría hacer es deshacerme de Eval(Parse()) (normalmente hace que el script sea más fácil de depurar y no se adquieren malos hábitos). Pero requerirá algo de esfuerzo y técnicas diferentes, por lo que se puede trabajar en ello lentamente.
También puedo echar un vistazo en unas 12 horas para que puedas tener una idea de lo que podrías hacer potencialmente.
Re: Ayuda, mi script se ejecuta correctamente en una ventana de script, pero falla cuando se ejecuta en una fórmula de columnaEstoy de acuerdo. Yo iría un paso más allá y reemplazaría también Eval Insert() .
Respecto a Eval(Parse()) , puedes omitirlo:

Parse espera una cadena como argumento.
Se evaluará una expresión y la cadena resultante se analizará y se devolverá como una expresión.
Parse(Print(1);"a"||"b")
Entonces,
Parse(Print(1);Eval Insert(Graph Builder());"a")
imprimirá 1, creará el gráfico y devolverá a como expresión. Si solo le interesa la parte central, puede omitir el análisis .
Envolver Parse(Eval Insert()) con Eval() aún lo evaluará.
Por otro lado, Eval(Eval Expr()) solo es necesario para evaluar un Expr() que está dentro.
Sin una Expr() , puedes eliminarla del código sin sufrir daños.
En general, propondría publicar un código que se base en un conjunto de datos de la carpeta Ayuda/Datos de muestra.
Luego, el código se puede ejecutar de inmediato sin necesidad de descargar archivos a través de Internet.
El beneficio adicional: adaptar el código a diferentes entradas a menudo ayuda a comprender el problema.
A menudo, cuando tengo el código correcto para publicar la pregunta, la pregunta desaparece : )

Re: Ayuda, mi script se ejecuta correctamente en una ventana de script, pero falla cuando se ejecuta en una fórmula de columnaEsto parece complicado (y lo es), pero así es como probablemente lo abordaría (no es la única forma, también puedes utilizar << agregar variables/<< agregar elementos)
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 vez que esto funcione, tal vez comenzaría a pensar en la experiencia del usuario:
- ¿Tal vez debería usar un botón que crearía informes para las filas seleccionadas al presionarlo?
- ¿Puedo permitir que el usuario seleccione más de una fila?
- ¿Debo crear todos los informes en la misma ventana en ese caso?
- Si ya se ha creado el gráfico, ¿necesito volver a crearlo?
- Cuando el usuario cierra la ventana, ¿debo cerrar también las tablas de datos?
- ..
Ver más...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


Re: Ayuda, mi script se ejecuta correctamente en una ventana de script, pero falla cuando se ejecuta en una fórmula de columnaMuchas gracias Jarmo y Hogi.
Estoy respondiendo muy tarde, perdón por mi silencio, tuve que centrarme en otras prioridades los últimos meses pero ahora puedo volver a esto!
Reflexionaré sobre esto y probaré tus sugerencias.
Mejor,
-Predicador