Hacer que el controlador de estado de fila deje de funcionar si la tabla está ordenada¿Es posible aplicar un controlador de estado de fila a una tabla de datos y hacer que ese controlador continúe funcionando si se cambia la tabla de datos? por ejemplo, si una columna está ordenada por un script o de forma interactiva por un usuario?
Actualmente tengo dos tablas de datos: una tabla con estadísticas de resumen, una con datos sin procesar. El usuario selecciona una fila en la tabla de resumen, el controlador de estado de fila detecta qué fila está seleccionada, extrae el nombre del parámetro y crea un gráfico de la tabla de datos sin procesar utilizando el parámetro seleccionado.
Funciona bien (aunque selecciona la fila que se deseleccionó al principio antes de encontrar la fila recién seleccionada), sin embargo, falla si el usuario ordena la tabla de resumen (por ejemplo, si quiere ver el Cpk más bajo o alguna otra métrica ).
Veo el mismo problema en el siguiente ejemplo simple basado en la ayuda de secuencias de comandos:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
f = Function( {a}, Print( a ) );
rs = dt << make row state handler( f );
dt << Select Rows( 1 );
dt << sort( by( :weight ), replace table, order( ascending ) );
dt << Select Rows( 9 );La salida es:
Scriptable[]
[1]
Creo que esto puede estar relacionado con este elemento de la lista de deseos: https://community.jmp.com/t5/JMP-Wish-List/Improve-JMP-s-state-handlers-hover-label-row-state-handler/idi-p/527992 . ¿Hay algún trabajo alrededor?
Estoy usando JMP17.0 en MacOS.
¡Gracias!
Automatización y secuencias de comandosRe: Hacer que el controlador de estado de fila deje de funcionar si la tabla está ordenadaPor cierto, me doy cuenta de que el ejemplo con guión que di podría resolverse fácilmente agregando
rs = dt << make row state handler( f );
inmediatamente después de mi comando Sort(). Es el caso interactivo (donde un usuario ordena manualmente la tabla por una columna y luego selecciona una fila) ese es el problema.
Probé una solución agregando un script a la tabla que restablece el controlador de estado de fila:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
f = Function( {a}, Print( a ) );
rs = dt << make row state handler( f );
dt << new script("Fix Row State Handler",
rs = dt << make row state handler( f );
); // errors when the script is run!
dt << Select Rows( 1 );
wait(0);
dt << sort( by( :weight ), replace table, order( ascending ) );
rs = dt << make row state handler( f ); // fixes issue when scripting
dt << Select Rows( 9 );pero recibo un error cuando hago clic en el triángulo verde para ejecutar el script:
Send Expects Scriptable Object in access or evaluation of 'Send' , dt << /*###*/make row state handler( f ) /*###*/ at line 6 in ...
Sin embargo, incluso si esto funcionara, no sería lo ideal, ya que requiere que el usuario recuerde hacer esto después de ordenar la tabla.
Gracias,
Mateo.
Re: Hacer que el controlador de estado de fila deje de funcionar si la tabla está ordenadaHola,
Tal vez pueda usar un informe para impulsar el script. Los cuadros de tabla pueden ejecutar secuencias de comandos cuando se seleccionan las filas y no parecen romperse cuando se ordena la tabla de resumen; intente lo siguiente para tener una idea.
Names Default To Here(1);
dt = open ("$Sample_Data\Car Physical Data.jmp");
dtSum = dt << summary( group(:Country), mean(:weight) );
nw = new window("ex",
dtb = Data Table Box( dtSum,
<< Set Selectable rows,
<< Set Click Sort )
);
//do something when a row is selected. Here, we just print the country.
dtb << Set Row Change Function ( function( { this },
selCountry = this[1][this << get selected rows];
print(evalinsert("Selected country is: ^selCountry[1]^."))
) );
Salud,
Brady
Re: Hacer que el controlador de estado de fila deje de funcionar si la tabla está ordenadaHola Brady, esto es genial, ¡gracias! Esto me ha dado una solución mucho más robusta y utilizable que la que tenía antes.
Una pregunta: ¿es posible consultar el Cuadro de tabla de datos de JSL para averiguar por qué columna (si corresponde) el usuario ha ordenado la tabla?
Saludos,
Mateo.
Re: Hacer que el controlador de estado de fila deje de funcionar si la tabla está ordenadaHola Mateo,
No conozco una forma de consultar para ver qué columna (si corresponde) se usó para ordenar la tabla. Puede usar la fuerza bruta al verificar las columnas, pero puede ser costoso, según el tamaño de la tabla.
Re: Hacer que el controlador de estado de fila deje de funcionar si la tabla está ordenadaHola Brady,
gracias por el consejo.
No conozco una forma de consultar para ver qué columna (si corresponde) se usó para ordenar la tabla. Puede usar la fuerza bruta al verificar las columnas, pero puede ser costoso, según el tamaño de la tabla.
¿Me podrían ayudar con el método de fuerza bruta? Intenté mirar las propiedades de DataTableColBox y la ventana en sí y no encontré nada que me ayude a ver si está ordenado.
Gracias,
Mateo.