Utilice el cuadro de lista para cambiar el nombre raíz de varias variables en un gráfico de serie temporalHola, estoy tratando de brindarle al usuario la posibilidad 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 raíz.
Sin embargo, tengo dificultades para saber cómo actualizarlo dinámicamente.
El cuadro de lista contiene una lista de etiquetas, luego las variables que se trazarán 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 creador 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é hacer que el cuadro de lista sea 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 qué tan 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>Modelado estadístico avanzadoRe: Usar el cuadro de lista para cambiar el nombre raíz de múltiples variables en un gráfico de serie temporalDe hecho, resolví este, agregando otro cuadro vlist y agregándole la distribución dentro del script onchange(.
¡gracias por el consejo!
Re: Usar el cuadro de lista para cambiar el nombre raíz de múltiples variables en un gráfico de serie temporalHola, muchas gracias, eso aclaró algunas 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 script, hace casi todo lo que quiero, eliminando la distribución anterior 'onchange' pero crea una nueva distribución fuera del panel/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" mode="NONE">Re: Usar el cuadro de lista para cambiar el nombre raíz de múltiples variables en un gráfico de serie temporal</LINGO-SUB><LINGO-BODY id="lingo-body-277091" slang="en-US" mode="NONE"><P><A href="https://community.jmp.com/t5/user/viewprofilepage/user-id/18907" target="_blank">@spudton</A> ,</P>
<P> </P>
<P>Es posible que los mensajes disponibles para una plataforma JMP no estén disponibles en otras. La plataforma GraphBuilder permite a un usuario a través de la interfaz de usuario arrastrar y soltar para agregar y eliminar variables. Por lo tanto, JSL implementó Agregar variable () y Eliminar variable () en GraphBuilderBox.</P>
<P> </P>
<P>La distribución no tiene dicha interfaz, por lo que no existe ningún método para agregar y eliminar variables.El JMP Scripting Index, 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 utilizando JSL.Un par de opciones son:</P>
<P><STRONG>Opción</STRONG> : Cambie su plataforma de distribución para que sea un GraphBuilder que cree una distribución. No tendrá las mismas características ni tendrá el mismo aspecto. Sin embargo, puedes 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 haces Report3, anidado dentro de ese cuadro. En realidad, lo cambiaría a VListBox ya que no estás usando 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 JSL del lenguaje de secuencias de comandos JMP, segunda 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: Usar el cuadro de lista para cambiar el nombre raíz de múltiples variables en un gráfico de serie temporalEso es genial gracias.
Repetí la sintaxis con la trama de mi segunda serie temporal y funciona bien.
No puedo resolver 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. ¡Está casi hundiéndote!
Re: Usar el cuadro de lista para cambiar el nombre raíz de múltiples 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ás recibiendo podría deberse a que no usaste el JSL
curr_TAG = TAG[1];
TAG 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 ingresó 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. Creé algunas variables en la tabla que generé para probarla ayer.
Re: Usar el cuadro de lista para cambiar el nombre raíz de múltiples variables en un gráfico de serie temporalHola, gracias de nuevo. Adjunté una tabla que contiene todas las columnas con algunos datos.
Eliminaré las declaraciones codificadas y haré algunas tareas domésticas como usted recomendó una vez que tenga un método claro sobre cómo voy a hacer esto.
Ingresé su código pero apareció el error "el argumento jsl debe ser un carácter en el acceso o evaluación de 'Concat'"
saludos
wayne
Re: Usar el cuadro de lista para cambiar el nombre raíz de múltiples 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 los elimine, por ejemplo
- Enviar a informar rangos de fechas del eje X
- Enviar a elementos de leyenda del informe (o necesita mantenerlos)
Parece que tienes tu TAG inicial codificado.Entonces configuré el curr_TAG inicial en ese valor.A continuación muestro el JSL para eliminar y agregar variables a 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 necesitas comprobar?
Como se indicó anteriormente, existen varios 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: Usar el cuadro de lista para cambiar el nombre raíz de múltiples 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 prediseñados (consulte las pestañas) y la acción en la selección 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 segundo GraphBuilderBox.

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

Aquí está el script para el 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 indica 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 ayudar con el script. No he probado su aplicación porque no tengo una tabla de datos con los nombres de columna esperados.
Quizás esto no sea nada nuevo para ti.Sólo intento darte algunas pistas, por si acaso.
Re: Usar el cuadro de lista para cambiar el nombre raíz de múltiples 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 y luego la aplicación muestra el gráfico de serie temporal de varias columnas, todas con esa etiqueta como raíz del nombre.
Seleccione TAG ABC123 y la serie temporal mostrará ABC123.ETARG, ABC123.UP, ABC123.LO y ABC123.PV.
Re: Usar el cuadro de lista para cambiar el nombre raíz de múltiples variables en un gráfico de serie temporal@spudton ,
Existen varios métodos para hacer esto. El método que elija dependerá de la acción que espere 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 pregunta es si desea que el informe se actualice con cada selección, o tal vez agregue un botón, de modo que una vez seleccionado, el usuario presione el botón Ir, Volver a ejecutar o Hacer para rehacer los análisis.
Con respecto al informe GraphBuilder, puede agregar y eliminar variables al cuadro Graph Builder. o puede agregar un filtro local de Excluir cuya visibilidad se contraiga y capture todas las selecciones excepto las de los usuarios. Estas podrían ser opciones en lugar de Eval Expr.Cuando se escribió JSL Companion 2nd Edition, se omitió el uso de GraphBuilderBox.
Te sugiero que hagas un gráfico con los filtros y pruebes 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 son posibles varias selecciones.
No leí su código con mucha atención, pero puede hacer referencia a un cuadro de visualización usando el espacio de nombres de la ventana, tal vez ventana:GraphBuilderBox(2) o establecer una relación como (este << padre), etc.
Por lo tanto, existen múltiples opciones para lograr lo que desea y depende de la estructura de árbol actual del informe y del comportamiento que desee de su interfaz de usuario.