¿Actualizar el contenido de un DisplayBox con un Associate Array cuando cambia la selección de un ComboBox?[Versión: JMP Pro 16.2.0]
Hola,
Estoy tratando de construir una ventana de interfaz para un script que:
- envía la tabla de datos actual a Python y obtiene los valores de entrada del usuario para los parámetros,
- realiza algunas acciones en Python,
- agrega algunas columnas de un marco de datos de Python a la tabla de datos actual.
Agregué como archivo adjunto el diseño que tengo en mente para la interfaz.
Todavía no he descubierto cómo actualizar el contenido de los parámetros que solicito al usuario que ingrese Dependiendo de la opción seleccionada por el usuario en el ComboBox anterior.
Para facilitar el mantenimiento del código y evitar la redundancia de código (importante para mí porque planeo tener muchas opciones en ComboBox), me gustaría almacenar los parámetros y sus valores predeterminados en una matriz asociativa encima del script. El número de parámetros para cada opción puede ser diferente.
Miré el código de este complemento ( https://community.jmp.com/t5/JMP-Add-Ins/Data-visualization-with-t-SNE-and-UMAP/ta-p/177969 ) pero, lamentablemente, los campos que se mostrarán y los valores de sus cuadros de edición de números asociados están codificados.
Gracias por tu ayuda.
Atentamente,
francois
#Emmanuel_Romeu
#James_Bark
AA =
Associative Array(
{
{"Choice_A",
[
"param_1" => 2,
"param 2" => 15,
"param_4" => .
]
},
{"Choice_B",
[
"param 1" => 2,
"param 3" => 10,
"param 4" => .
]
},
{"Choice_C",
[
"param 1" => 3,
"param 4" => .,
"param 6" => 23,
"param 7" => 123
]
}
}
);

Acceso a los datosRe: ¿Actualizar el contenido de un DisplayBox con un Associate Array cuando cambia la selección de un ComboBox?Todavía no he realizado un seguimiento de si todos estos se han respondido en otras publicaciones, pero dos pensamientos:
- Si desea mantener los parámetros ordenados, puede usar matrices dentro de su matriz asociativa, como esta:
AA = Associative Array( {
{"Choice_A", [
//Array of here to maintain order<BR /> ["name" => "param_1", "default" => 2],
["name" => "param_2", "default" => 15],
["name" => "param_3", "default" => .],
]}
} )
- Puede especificar el ancho del cuadro de texto y del cuadro de edición de números para que todo se alinee, o en su lugar puede usar una tabla con cuadros de edición de columna de número .
Re: ¿Actualizar el contenido de un DisplayBox con un Associate Array cuando cambia la selección de un ComboBox?Las áreas asociativas no tienen orden. No se puede imponer uno. JMP ordena los resultados solo para su comodidad cuando examina el contenido con un mensaje como << Obtener claves.
Names Default to Here( 1 );
// load an associative array in order of C, B, A
aa = Associative Array();
aa["Choice_C"] = ["param 1" => 3, "param 4" => ., "param 6" => 23, "param 7" => 123];
aa["Choice_B"] = ["param 1" => 2, "param 3" => 10, "param 4" => .];
aa["Choice_A"] = ["param_1" => 2, "param 2" => 15, "param_4" => .];
// examine associative array as a whole (JMP orders output, not content, alphanumerically)
Show(
aa << Get Keys,
aa << Get Values,
aa
);
// examine associative array one entry at a time
i = aa << First;
While( Not( Is Empty( i ) ),
Show( aa[i] );
i = aa << Next( i );
);
Re: ¿Actualizar el contenido de un DisplayBox con un Associate Array cuando cambia la selección de un ComboBox?Puede hacer que el cuadro de diálogo sea modal, como se muestra a continuación.
Para realizar una función de recuperación, deberá evitar reinicializar los AA cada vez que se abre la ventana, inicializando los AA en otra parte del código, que se puede separar del código utilizado para mostrar la ventana.
Cada vez que se presiona el botón Aceptar, además de guardar los nuevos valores en el AA apropiado como ya se hizo, puede guardar la configuración en variables globales (o, preferiblemente, de alcance) y usar los valores de estas variables para completar el cuadro de diálogo la próxima vez que se presione "recordar".
Names Default To Here( 1 );
AAopt1 = Associative Array( Words( "p1,p2,p3", "," ), {1, 2, 3} );
AAopt2 = Associative Array( Words( "p1,p4", "," ), {1, 10} );
AAopt3 = Associative Array( Words( "p2,p5,p6,p7", "," ), {2, 6, 12, 20} );
MainAA = Associative Array( Words( "option1,option2,option3", "," ), Eval List( {AAopt1, AAopt2, AAopt3} ) );
nw = New Window( "xx", <<MODAL></MODAL>Re: ¿Actualizar el contenido de un DisplayBox con un Associate Array cuando cambia la selección de un ComboBox?Hola Brady,
Gracias por su pronta respuesta.
Eché un vistazo de cerca a su guión, experimenté con él y le hice algunas actualizaciones.
Todavía tengo algunas preguntas/comentarios si no te importa:
- Dividir el AA principal en varios AA, uno para cada opción está bien para mí
- ¿Se podría adaptar su script para que la ventana sea Modal?
Preferiría congelar la interfaz de la ventana e inmediatamente cerrarla una vez que el usuario haga clic en "Aceptar". - ¿Se puede agregar fácilmente a esta interfaz un cuadro de botones de "recuperación" que funcione?
- Por último, agregué algunos comentarios a su secuencia de comandos actualizada para explicar lo que estoy tratando de hacer.
De nuevo, gracias por tu ayuda.
Salud,
francois
Re: ¿Actualizar el contenido de un DisplayBox con un Associate Array cuando cambia la selección de un ComboBox?Hola @ih ,
Gracias por su pronta respuesta.
Eché un vistazo de cerca a su secuencia de comandos con variables de ventana.
Jugué con él y le hice algunas actualizaciones.
Todavía tengo algunas preguntas/comentarios si no te importa:
- Un problema para mí es que el orden de los parámetros que se ingresarán no sigue el orden en que los puse en la matriz asociativa.
Me gustaría tenerlos en el mismo orden que el de la definición de AA. Es eso posible ? - ¿Se puede mejorar el diseño de las parejas (Cuadro de texto, Cuadro de edición de números) de modo que estén alineados en dos columnas separadas (agrego una captura de pantalla para ilustrar, hecho con LineUp Box-)
También intenté reemplazar el V List Box (window:vlbParam) por un Table Box, sin éxito hasta ahora. - ¿Se puede agregar fácilmente a esta interfaz un cuadro de botones de "recuperación" que funcione?
- Por último, agregué algunos comentarios a su secuencia de comandos actualizada para explicar lo que estoy tratando de hacer.
Gracias de nuevo !
Saludos,
francois
Re: ¿Actualizar el contenido de un DisplayBox con un Associate Array cuando cambia la selección de un ComboBox?Hola,
Una manera relativamente eficiente de hacer esto es la siguiente.
1) Definir conjuntos de parámetros/valores en AA, un AA para cada opción.
2) Coloque estos AA en un AA "principal".
3) Use el cuadro combinado para seleccionar dentro del AA "principal"
4) Para cualquier selección, muestre un solo cuadro de tabla (después de eliminar el actual, si está presente), cuyas filas correspondan a las entradas en la opción AA relevante.
5) Cuando se presiona el botón "ir", es fácil actualizar la "opción" AA relevante con las entradas que se hayan realizado y continuar. Aquí, el mainAA se escribe en el registro para que pueda ver su contenido después de cada pulsación.
Salud,
Brady
Names Default To Here( 1 );
AAopt1 = Associative Array( Words( "p1,p2,p3", "," ), {1, 2, 3} );
AAopt2 = Associative Array( Words( "p1,p4", "," ), {1, 10} );
AAopt3 = Associative Array( Words( "p2,p5,p6,p7", "," ), {2, 6, 12, 20} );
MainAA = Associative Array( Words( "option1,option2,option3", "," ), Eval List( {AAopt1, AAopt2, AAopt3} ) );
nw = New Window( "xx",
V List Box(
cb = Combo Box(
mainAA << get keys,
Try( TB << delete );
tableVLB << append(
tb = Table Box(
TbSCB = String Col Box( "parameter", mainAA[cb << get selected] << Get Keys ),
TbNCEB = Number Col Edit Box( "value", mainAA[cb << get selected] << Get Values )
)
);
),
tableVLB = V List Box(),
bb = Button Box( "Go",
mainAA[cb << get selected] = Associative Array( TbSCB << get, TbNCEB << get );
Show( mainAA );
)
)
);
eval(cb << get function);

Re: ¿Actualizar el contenido de un DisplayBox con un Associate Array cuando cambia la selección de un ComboBox?Hola @fch_jmp ,
Si entiendo su pregunta correctamente, creo que esto hace lo que está buscando:
Names default to here(1);
AA = Associative Array( {
{"Choice_A", ["param_1" => 2, "param 2" => 15, "param_4" => .]},
{"Choice_B", ["param 1" => 2, "param 3" => 10, "param 4" => .]},
{"Choice_C", ["param 1" => 3, "param 4" => ., "param 6" => 23, "param 7" => 123]}
} );
//return a label and
parambox = function({name,val},
h list box(
text box(name),
nebParam[name] = number edit box(val)
)
);
updateparams = function({},
while( !is empty( vlbParams << child ), (vlbParams << child) << delete );
nebParam = Associative Array();
for each({{param, value}, i}, AA[cb << GetSelected()],
vlbParams << append(
parambox(param, value)
);
)
);
win = new window("cb test",
cb = Combo Box(
AA << Get Keys,
updateparams();
),
vlbParams = v list box(),
button box("Write to the log",
for each({{param, value}}, nebParam, print(param || ": " || char(value << get)));
)
);
cb << set(1);
updateparams();
Tenga en cuenta que con este método, varias ventanas podrían colisionar entre sí, por lo que en realidad usaría variables de ventana. Intente ejecutar esto una vez, cambie su matriz de parámetros y luego ejecútelo nuevamente y observe cómo ambas ventanas funcionan de forma independiente.
Ver más...