Use el cuadro de lista para cambiar el nombre raíz de varias variables en un gráfico de serie temporalHola, estoy tratando de darle al usuario la capacidad de elegir un nombre de etiqueta y crear un gráfico de serie temporal de múltiples variables que tengan ese nombre de etiqueta como su raíz.
Sin embargo, estoy luchando sobre cómo actualizar eso dinámicamente.
El cuadro de lista contiene una lista de etiquetas, luego las variables a trazar tendrán ese nombre de etiqueta, más una extensión, .PV, .ETARG, etc. en este ejemplo.

Analizo la siguiente declaración para generar los nombres de las variables.
vars = {};
str = "Variables(
X( :Time ),
Y( :" || TAG || ".ETARG, Position (1) ),
Y( :" || TAG || ".LO, Position( 1 ) ),
Y( :" || TAG || ".PV, Position( 1 ) ),
Y( :" || TAG || ".UP, Position( 1 ) )
)";
vars = parse(str);luego, el generador de gráficos hace referencia a estos, en lugar de tener etiquetas fijas para trazar
Eval Expr(
DataTable1<<GRAPH builder=""></GRAPH>
Tengo un cuadro de lista donde el usuario puede elegir el nombre raíz de las variables
ChooseET = List Box( ( ET_TAG_LIST ),
maxSelected( 1 ),
onChange(
TAG = ChooseET << Get Selected;Pero los nombres de las variables en el generador de gráficos son estáticos. ¿Cómo hago esta dinámica? Intenté convertir el cuadro de lista en una expresión dentro del generador de gráficos, pero esto no funciona.
el cuadro de lista y el generador de gráficos están dentro de una declaración de asignación. No estoy seguro de qué es esto y cuán relevante es.
gracias de antemano, aquí está el código completo!
JMP App(
Set Name( "Application" ),
Set Description(
"An empty workspace for creating custom applications with one or more windows and scripts"
),
Auto Launch( 1 ),
Snap To Grid( 1 ),
Show Grid( 1 ),
Show Properties( 1 ),
Show Sources( 1 ),
Group By Category( 1 ),
Dashboard Mode( 0 ),
Parameters,
Tables(
DataTable1 = GuiTable(
Set Path( "" ),
Set Label( "Output Table" ),
Set Location( "Current Data Table" ),
Set Invisible( 0 )
)
),
Script(JSL Quote(// This script is executed when the application is run.
// Named objects have been created for the application modules
// (for example, "Module1") and the pre-defined object
// "thisApplication" refers to the application object itself.
// Variables and functions declared here are scoped to the
// Application namespace.
dt = Current data table();
ETSelected = "A04004DD";
TAG = ETSelected;;
vars = {};
str = "Variables(
X( :Time ),
Y( :" || TAG || ".ETARG, Position (1) ),
Y( :" || TAG || ".LO, Position( 1 ) ),
Y( :" || TAG || ".PV, Position( 1 ) ),
Y( :" || TAG || ".UP, Position( 1 ) )
)";
vars = parse(str);
show(vars);
PDChartproperties = "
{Legend Model(
3,
Properties( 0, {Line Color( 4 )}, Item ID( \!"" || TAG ||".ETarg\!", 1 ) ),
Properties( 1, {Line Color( 19 ), Marker Size( 1 )}, Item ID( \!"" || TAG ||".LO\!", 1 ) ),
Properties( 2, {Line Color( 53 )}, Item ID( \!"" || TAG ||".PV\!", 1 ) ),
Properties( 3, {Line Color( 19 ), Marker Size( 1 )},Item ID( \!"" || TAG ||".UP\!", 1 )
)
)}
";
props = parse(PDChartproperties);
show(props);
dt = Current Data Table();
ET_LIST = {};
ET_TAG_List = {};
For( i = N Col( dt ), i >= 1, i--,
ET_col = Column (dt, i) << Get Name ();
If(
(Col N Missing( Column( i ) ) / N Row()) != 1 &
Contains (ET_col, "ETarg"),
Insert Into(ET_LIST, ET_col);
);
);
Show (ET_LIST);
n = N Items( ET_LIST );
For( i = 1, i <= n, i++,
ETARG = ET_LIST[i] ;
NFull = Length(ETARG) ;
ETTAG = Left(ETARG,(NFull-6)) ;
Insert Into(ET_TAG_List, ETTAG);
);
Show(ET_TAG_List);
) ),
Allocate(
Module1 = Plan(
PreAllocate,
Script(JSL Quote(// This script is executed when a new module instance is
// created. The pre-defined object "thisModuleInstance" refers
// to the instance object, but other objects such as boxes and
// scripts have not yet been created. Variables declared here are
// scoped to the ModuleInstance namespace.
// This special function will receive parameters passed to CreateInstance()
OnModuleLoad({},
);
thisModuleInstance << Create Objects;
// After this point your module instance objects have been created
// and can be referred to by name (for example, "Button1").
ColList1Select=Function({this},{selectedIndices},
// This function is called when the List Box selection changes
selectedIndices = this << Get Selected Indices;
);
) ),
Allocate(
DataFilterContext1 = Data Filter Context Box();
Lineup2 = Lineup Box();
Report3 = Platform(
DataTable1,
Distribution(
Continuous Distribution(
Column( :A04004DD ET_DELTA Ratio )
),
SendToReport(
Dispatch(
{"A04004DD ET_DELTA Ratio"},
"1",
ScaleBox,
{Min( -5 ), Max( 5 ), Inc( 0.1 ), Minor Ticks( 0 )}
),
Dispatch(
{"A04004DD ET_DELTA Ratio"},
"Quantiles",
OutlineBox,
{Close( 1 )}
),
Dispatch(
{"A04004DD ET_DELTA Ratio"},
"Summary Statistics",
OutlineBox,
{Close( 1 )}
)
)
)
);
Report1 = Platform(
DataTable1,
Graph builder(
Size( 430, 370 ),
Show Control Panel( 0 ),
Fit to Window( "Maintain Aspect Ratio" ),
Variables(
X( :Time ),
Y( :ZZ ET Metric ),
Y( :A04004DD ET_Pass, Position( 1 ) ),
Y( :A04004DD ET_Pass Ave, Position( 1 ) )
),
Elements( Points( X, Y( 1 ), Y( 2 ), Y( 3 ), Legend( 3 ) ) ),
SendToReport(
Dispatch(
{},
"Time",
ScaleBox,
{Min( 3675484152 ), Max( 3676021620 ),
Interval( "Day" ), Inc( 5 ), Minor Ticks( 0 )}
)
)
)
);
ChooseET = List Box( ( ET_TAG_LIST ),
maxSelected( 1 ),
onChange(
TAG = ChooseET << Get Selected;
If( N Items( TAG ) != 0,
Show( TAG );
);
) );
DataFilter1 = DataTable1 << Data Filter(
Local,
Add Filter(
columns( :Day ),
Display( :Day, Size( 0, 0 ), Height( 0 ) )
)
);
Report2 = Platform(
DataTable1,
gb = Eval(
Eval Expr(
DataTable1<<GRAPH builder=""></GRAPH>Gráficossecuencias de comandosRe: Use el cuadro de lista para cambiar el nombre raíz de varias variables en un gráfico de serie temporalen realidad, resolví este, agregando otro cuadro de lista virtual y agregando la distribución dentro del script onchange (.
¡gracias por el consejo!
Re: Use el cuadro de lista para cambiar el nombre raíz de varias variables en un gráfico de serie temporalHola, muchas gracias, eso me aclaro un par de cosas y he invertido en el libro.
Inicialmente construí la aplicación gráficamente, y creo que la Distribución está anidada en lineup2, pero definida en la instrucción Organize(reparent (Lineup2(ChooseET).
Cuando ejecuto mi secuencia de comandos, hace casi todo lo que quiero, eliminando la distribución anterior 'al cambiar', pero crea una nueva distribución fuera del tablero/aplicación, en lugar de anidarla en el cuadro Alineación.
Adjunto el guión completo. Agradecería cualquier información adicional, no puedo encontrar ningún material de referencia sobre los comandos reparent/allocate.</CODE></P></LINGO-BODY><LINGO-SUB id="lingo-sub-277091" slang="en-US">Re: Use el cuadro de lista para cambiar el nombre raíz de varias variables en un gráfico de serie temporal</LINGO-SUB><LINGO-BODY id="lingo-body-277091" slang="en-US"><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/18907" target="_blank">@spudton</A> ,</P>
<P> </P>
<P>Los mensajes disponibles para una plataforma JMP pueden no estar disponibles en otras. La plataforma GraphBuilder permite que un usuario a través de la interfaz de usuario arrastre y suelte para agregar y eliminar variables. Por lo tanto, JSL implementó Add Variable() y Remove Variable() en GraphBuilderBox.</P>
<P> </P>
<P>La distribución no tiene esa interfaz, por lo que no hay ningún método para agregar y eliminar variables.El Índice de secuencias de comandos de JMP, que se encuentra en el menú Ayuda, mostrará la mayoría, si no todos, los mensajes disponibles para una plataforma.Menú principal > Ayuda > Índice de secuencias de comandos > Objetos (campo de la esquina superior izquierda) > Distribución.</P>
<P> </P>
<P>Descubrirá que normalmente hay más de un método para hacer algo usando JSL.Un par de opciones son:</P>
<P><STRONG>Opción</STRONG> : Cambie su plataforma de distribución para que sea un GraphBuilder que crea una distribución. No tendrá las mismas opciones ni tendrá el mismo aspecto. Sin embargo, puede agregar y eliminar variables.</P>
<PRE><CODE class=" language-jsl">gbdist =Graph Builder(
Size( 534, 456 ),
Show Control Panel( 0 ),
Variables( Y( :A04004DD ET_DELTA Ratio ) ),
Elements( Histogram( Y, Legend( 3 ), Counts( 1 ) ) )
);
Opción : Utilice un contenedor para su distribución. Necesita tener un marcador de posición en su pantalla para ello. Luego, al cambiar una variable, elimina la distribución existente en ese contenedor y luego agrega una nueva. Recuerde que dije que había elementos para limpiar en su código. No los limpié todos.
El código tiene un contenedor vacío, Lineup2. Si hace Report3, anidado dentro de ese cuadro. En realidad, lo cambiaría a un VListBox ya que no está utilizando el poder de LineupBox.
Lineup2 = Lineup Box();
Report3 = Platform(
DataTable1,
Distribution(
Continuous Distribution(
Column( :A04004DD ET_DELTA Ratio )
),
A continuación se muestra una parte del guión. 7_InteractiveDisplays.jsl escrito para Aplicaciones complementarias de JSL del lenguaje de secuencias de comandos JMP, 2.ª edición .
clear globals();
orig_dt = Open( "$SAMPLE_DATA/Fitness.jmp" );
cnt = 0; Chosen Columns={}; //initiate values
//----Refresh display script---------------------------
refresh_script = Expr(
Try(dist_vlist << delete);
If( (cnt > 0 & N Items( Chosen Columns ) >= 1),
show(Chosen Columns);
dist_vlist = VListBox(
orig_dist = orig_dt << Distribution( Column( Eval( Chosen Columns ) ), invisible )
); //end VListBox
result_ob << append( dist_vlist );
) //end If
); //end Expr
//----Action to take for Add-----------------------------
add_script = Expr(
cnt = cnt + 1;
listocols << Append( selcol << Get Selected );
);
//----Action to take for Remove -----------------------------
remove_script= Expr(
cnt = cnt + 1;
listocols << Remove Selected;
);
//_______________________________________________________________________________
//-----Dialog Window layout---------------------------------
dist_win = New Window( "Create Distributions",
H List Box(
selcol = Col List Box( All, width( 100 ), nlines( 6 ) ),
Lineup Box( N Col( 1 ), Spacing( 3 ),
Button Box( "Add Column >>", add_script ),
Button Box( "<< Remove Column", remove_script )
),
// listocols is a Col List Box
listocols = Col List Box( width( 100 ), nlines( 6 ),
OnChange( Chosen Columns = listocols << Get Items;
refresh_script;)
) //end listocols
), //end HListBox
Text Box( " " ),
result_ob = Outline Box( "Current Selections" )
);
Sé que probablemente estés trabajando en una tarea con una fecha límite. Pero prueba este script. Proporciona ejemplos de varias características a las que me referí en las publicaciones de esta discusión. Proporciona instrucciones para agregar y eliminar distribuciones, la segunda opción.
¡Buena suerte!
Re: Use el cuadro de lista para cambiar el nombre raíz de varias variables en un gráfico de serie temporalEso es genial gracias.
Repetí la sintaxis con mi segunda trama de serie temporal y funciona bien.
No puedo calcular la sintaxis para cambiar la columna en el cuadro de distribución cuando se cambia el nombre de la ETIQUETA.
¿Debería funcionar esto en un objeto de distribución?
Eval( Eval Expr( Dstr3 << Remove Variable( {Expr( Column( dt, curr_TAG || " ET_DELTA Ratio" ) )} ) ) );
Adjunto el guión completo.
Gracias de nuevo por la ayuda. ¡Casi se está hundiendo!
Re: Use el cuadro de lista para cambiar el nombre raíz de varias variables en un gráfico de serie temporal@spudton ,
Adjunté el script que se ejecuta en su mesa en mi PC.
El error que está recibiendo podría estar ocurriendo porque no usó el JSL
curr_TAG = TAG[1];
ETIQUETA es el resultado de ListBox << ser seleccionado ; que devuelve una lista, debe obtener el primer elemento de la lista.
Oh, el otro problema es que mi tabla generada usó la extensión ETARG.El código que introdujiste cambió ETARG a ETarg Esa podría ser la otra fuente de error.
El script tiene una línea comentada show(curr_TAG) . Descomente y mire el registro.
Tenga en cuenta que verá un par de líneas comentadas. Hice algunas variables en la tabla que generé para probarla ayer.
Re: Use el cuadro de lista para cambiar el nombre raíz de varias variables en un gráfico de serie temporalHola, gracias de nuevo. He adjuntado una tabla que contiene todas las columnas con algunos datos.
Eliminaré las declaraciones codificadas y haré algunas tareas de limpieza como me recomendó una vez que tenga un método claro sobre cómo voy a hacer esto.
Ingresé su código pero obtuve el error "el argumento jsl debe ser un carácter en el acceso o evaluación de 'Concat'"
saludos
wayne
Re: Use el cuadro de lista para cambiar el nombre raíz de varias variables en un gráfico de serie temporal@spudton
Miré tu código.El script tiene un identificador para el segundo GraphBuilder.Tuve que hacer algunos cambios, porque no tenía una tabla de datos para usar.
Su código tiene varios elementos codificados, le sugiero que elimine, por ejemplo
- Enviar a Informe Rangos de fechas del eje X
- Enviar a los elementos de la leyenda del informe (o necesita mantenerlos)
Parece que tiene su TAG inicial codificado.Así que establecí el curr_TAG inicial en ese valor.A continuación, muestro el JSL para eliminar, agregar variables al GraphBuilderBox. Creo que podría ser más elegante tener un contenedor alrededor de gb y, al cambiar, eliminar gb y luego agregar un nuevo gb.
Un par de comentarios: ¿está seguro de que la tabla de datos siempre tendrá las columnas PV, LO, UP?¿Es esto algo que necesita comprobar?
Como se indicó anteriormente, existen múltiples métodos para lograr el mismo resultado.¡Buena suerte!
curr_TAG = "A04004DD";
ChooseET = List Box( ( ET_TAG_LIST ),
maxSelected( 1 ),
onChange(
TAG = ChooseET << Get Selected;
If( N Items( TAG ) != 0,
Show( TAG );
gbb2 = Report(gb)[GraphBuilderBox(1)];
Eval( EvalExpr(gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".ETARG")), Role("Y"), Position(1)} );
gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".LO")), Role("Y"), Position(1)} );
gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".PV")), Role("Y"), Position(1)} );
gbb2 << Remove Variable({Expr(column(dt,curr_TAG||".UP")), Role("Y"), Position(1)} );
));
curr_TAG = TAG[1];
//show(curr_TAG);
wait(0);
Eval( EvalExpr(gbb2 << Add Variable({Expr(column(dt,curr_TAG||".ETARG")), Role("Y"), Position(1)} );
gbb2 << Add Variable({Expr(column(dt,curr_TAG||".LO")), Role("Y"), Position(1)} );
gbb2 << Add Variable({Expr(column(dt,curr_TAG||".PV")), Role("Y"), Position(1)} );
gbb2 << Add Variable({Expr(column(dt,curr_TAG||".UP")), Role("Y"), Position(1)} );
));
);
);
) ;
Re: Use el cuadro de lista para cambiar el nombre raíz de varias variables en un gráfico de serie temporal@spudton ,
A continuación se muestra una captura de pantalla de una aplicación con un cuadro de lista, cuando un usuario selecciona una variable, el informe cambia. En este ejemplo, todos los gráficos están prefabricados (ver las pestañas) y la acción de seleccionar es cambiar la pestaña visible. Su acción de selección sería eliminar la "etiqueta" actual y agregar la nueva etiqueta, supongo que se haría usando los mensajes para eliminar y agregar variables a su 2nd GraphBuilderBox.

Si cambia su aplicación de << Ejecutar a << Editar,
debería ver la interfaz de usuario de ApplicationBuilder. El ListBox (cart_lb) está resaltado y el contorno rojo muestra dónde agregar una función/secuencia de comandos para que se realice la acción trh cuando se realiza una selección

Aquí está el script para ListBox de esta aplicación
Local({idx, nme, tList},
tlist = (cart_lb << get selected);
if(nitems(tlist) >0,
nme = tlist[1];
//show(nme);
idx = var_tabs << index of tab(nme);
var_tabs << set selected(idx);
//show(idx);
); //end if
); //end Local
Como se indicó para esta aplicación, obtengo el índice de la lista. Las pestañas están alineadas con la lista, por lo que una vez que se conoce el índice, se muestra la pestaña asociada.
Sin saber si nombró la segunda pantalla de GraphBuilder, no puedo ayudarlo con el script. No he probado su aplicación porque no tengo una tabla de datos con los nombres de columna esperados.
Tal vez esto no sea nada nuevo para ti.Solo trato de darte algunas pistas, por si acaso.
Re: Use el cuadro de lista para cambiar el nombre raíz de varias variables en un gráfico de serie temporalGracias por la respuesta.
No quiero que el usuario tenga que seleccionar varias etiquetas. Quiero que elijan un elemento de la lista, luego la aplicación muestra el gráfico de serie temporal de varias columnas, todas con esa etiqueta como la raíz del nombre.
Así que seleccione ETIQUETA ABC123, y la serie de tiempo mostrará ABC123.ETARG, ABC123.UP, ABC123.LO y ABC123.PV
Re: Use el cuadro de lista para cambiar el nombre raíz de varias variables en un gráfico de serie temporal@spudton ,
Hay múltiples métodos para hacer esto. El método que elija depende de la acción que espera para la interfaz de usuario.
Un usuario puede seleccionar 1 elemento en su lista y luego usar el control, seleccionar otros y mantener presionada la tecla Mayús, tal vez un rango y luego eliminar algunos. Mi punto es si desea que el informe se actualice con cada selección, o tal vez agregar un botón, de modo que una vez seleccionado, el usuario presione el botón Ir, Volver a ejecutar o Hacerlo para rehacer los análisis.
Con respecto al informe GraphBuilder, puede agregar y eliminar variables en Graph Builder Box. o puede agregar un filtro local de Excluir cuya visibilidad esté colapsada que capture todas las selecciones excepto las de los usuarios. Estas pueden ser opciones en lugar de Eval Expr.Cuando se escribió JSL Companion 2nd Edition, se perdió el uso de GraphBuilderBox.
Le sugiero que haga un gráfico con los filtros y pruebe diferentes opciones, para entender cómo podría funcionar esto.
Personalmente, a menos que el usuario pueda hacer solo una selección, me gusta un botón para iniciar una tarea si es posible realizar varias selecciones.
No leí su código muy de cerca, pero puede hacer referencia a un cuadro de visualización usando el espacio de nombres de la ventana, tal vez window:GraphBuilderBox(2) o establecer una relación como (this<< parent), etc.
Por lo tanto, hay múltiples opciones para lograr lo que desea y depende de la estructura de árbol actual del informe y el comportamiento que desea de su interfaz de usuario.