¿Hay alguna manera de hacer que el controlador de estado de fila sea menos lento?¿Es posible hacer que el controlador de estado de fila solo se active con el mouse hacia arriba o después de que se complete un evento de selección?
El evento en tiempo real hace que la selección de arrastre de mi gráfico se retrase y hace que la experiencia del usuario sea desagradable.
He ido tan lejos como para reescribir completamente un evento de selección en la ratonera, pero tengo problemas para aplicarlo a los histogramas y ni siquiera me encanta cómo funciona.
Satisfaría mis necesidades si pudiera usar el cuadro de selección, la herramienta "Flecha (A)" al mismo tiempo que la función de trampa para ratones, de modo que simplemente pudiera recoger mis filas seleccionadas al final del evento de trampa para ratones en lugar de disparar un millón. eventos mientras arrastra el ratón.
Cosas que no me gustan:
Cuanto más tiempo mueva el mouse hacia abajo mientras selecciona, más y más secuencias de comandos de gráficos inútiles se acumulan en el gráfico.
Me gustaría tener uno y sólo uno. Agregué un bucle al final para eliminarlos a todos del gráfico, por lo que parecen "desvanecerse".
Podría dejarlos allí, pero agregan ruido visual al gráfico y no sé qué sucede cuando obtienes demasiados.
Editar: cuando obtienes demasiados, comienzan a retrasarse. Puede ser más rápido destruir el gráfico y reconstruirlo que hacer un bucle para eliminar los scripts de gráficos sobrantes. Edición 2: es mucho más rápido destruir el gráfico y volver a crearlo, pero luego se restablece el zoom, por lo que tendré que capturar más sobre el estado del gráfico para poder reconstruirlo y ocultar la actualización del usuario.
Obtuve las cosas de Shift/control clic para trabajar, simplemente se siente demasiado raro para la producción. Especialmente el clic de control tiene este largo tiempo de retraso después de que levantas el mouse y el cuadro de selección persigue al mouse incluso cuando ya has soltado el botón, creo que jmp está manejando un montón de eventos de arrastre obsoletos mientras tanto antes de que deje de moverse.
O simplemente descarte toda esta aventura y encuentre una manera de tener un controlador de estado de fila que se active con el mouse hacia arriba (eso sería ideal).
Ejemplos de los que tomé prestado el código:
http://www.pega-analytics.co.uk/blog/segmented-regression/
https://community.jmp.com/t5/Discussions/Quick-way-to-compare-two-lists-and-identify-the-uncommon/td-p/5811
Names Default To Here(1);
dt = open("$sample_data\Iris.jmp");
MY_GRAPH_BUILDER = Graph Builder(
Size( 531, 456 ),
Show Control Panel( 0 ),
Variables( X( :Sepal length ), Y( :Sepal width ) ),
Elements( Points( X, Y, Legend( 3 ) ) ),
SendToReport(
Dispatch({},"Graph Builder",
FrameBox,
{Add Graphics Script(MouseTrap( MouseDown(x,y), MouseUp(x,y)))}
),
),
);
//MOUSE STUFF
get_box_dims = Function({firstX,lastX,firstY,lastY},
show("get_box_dims");
//show(firstX,lastX,firstY,lastY,modifier_key);
If (lastX>firstX,
max_x = lastX; min_x =firstX,
max_x = firstX;min_x =lastX,
);
If (lastY>firstY,
max_y = lastY; min_y =firstY,
max_y = firstY;min_y =lastY,
);
show(min_x,min_y,max_x,max_y);
evallist({min_x,max_x,min_y,max_y});
);
do_normal_select = Function({select_range},
show("normal_select");
dt << Select Where(
AsColumn(:Sepal length) >= select_range[1]
& AsColumn(:Sepal length) <= select_range[2]
& AsColumn(:Sepal width) >= select_range[3]
& AsColumn(:Sepal width) <= select_range[4]
);
);
do_shift_select = Function({select_range},
show("shift_select");
new_rows_to_add = as list(dt << Get Rows Where(
AsColumn(:Sepal length) >= select_range[1]
& AsColumn(:Sepal length) <= select_range[2]
& AsColumn(:Sepal width) >= select_range[3]
& AsColumn(:Sepal width) <= select_range[4]
)
);
if (length(new_rows_to_add) > 0,
curr_rows = as list(dt << Get Selected Rows);
rows_to_select = curr_rows || new_rows_to_add;
dt << Select Rows( rows_to_select);
);
show(new_rows_to_add,length(new_rows_to_add));
);
do_ctrl_select = Function({select_range},
show("ctrl_select");
new_rows_to_subtract = associativearray(as list(dt << Get Rows Where(
AsColumn(:Sepal length) >= select_range[1]
& AsColumn(:Sepal length) <= select_range[2]
& AsColumn(:Sepal width) >= select_range[3]
& AsColumn(:Sepal width) <= select_range[4]
)
));
if (length(new_rows_to_subtract) > 0,
curr_rows = associativearray(as list(dt << Get Selected Rows));
show("current_rows_selected",length(curr_rows));
show("number_rows_to_subtract",length(new_rows_to_subtract));
intersection=curr_rows;intersection<<INTERSECT></INTERSECT>
Fusión y limpieza de datosIngeniería de Calidad y ProcesosventanasRe: ¿Hay alguna manera de hacer que el controlador de estado de fila sea menos lento?Dudo que esto esté muy bien documentado, en cualquier lugar... @Audrey_Shull
MouseTrap y la función Handle con un comportamiento similar no se ejecutan en línea como Rect() y el otro normal funciones de script de gráficos como Rect().
Cuando el flujo de control en la secuencia de comandos de gráficos pasa por Handle() o MouseTrap(), la función no hace nada en el caso de MouseTrap o dibuja un pequeño rectángulo en la posición del controlador para Handle. Cuando hace clic en un gráfico con un script gráfico, JMP busca en el script las funciones MouseTrap o Handle y las llama, en orden, hasta que una de ellas acepta el punto.
Entonces, en su ejemplo, hasta que haga clic, el código que establece x0 nunca se ha ejecutado. Pero el código Rect se ejecutará.
Creo que, sin intentarlo, podría tener varios Handles() seguidos de MouseTrap(), y JMP tomaría el punto de clic y lo pasaría a cada Handle() hasta que uno de ellos lo tome, o MouseTrap() que lo hará. tómalo siempre.
Rect() se puede usar en un bucle for para dibujar muchos rectángulos. No puede crear varios identificadores colocando Handle(...) en un bucle. Si necesita crear una cantidad variable de identificadores, puede usar MouseTrap() y una lista de ubicaciones x,y para buscar, o puede usar alguna forma de manipulación de expresiones para crear varias llamadas a Handle().
Esto también significa que MouseTrap/Handle debe estar en el script de gráficos, no en una función de usuario a la que llama el script de gráficos. Rect, por otro lado, puede estar en una función de usuario llamada desde el script de gráficos.
Si coloca dos MouseTraps en un script de gráficos, creo que nunca se podrá alcanzar el segundo porque el primero siempre aceptará el clic.
New Window( "Example",
exx = 20,
exy = 50;
Graph Box(
Frame Size( 200, 200 ),
If( 0, // note that it still works
Mousetrap(
exx = x;
exy = y;
)
);
Circle( {0, 0}, Sqrt( exx * exx + exy * exy ) );
);
);Re: ¿Hay alguna manera de hacer que el controlador de estado de fila sea menos lento?Esto hizo una gran mejora. ¡Gracias!
Re: ¿Hay alguna manera de hacer que el controlador de estado de fila sea menos lento?Intenté esto pero conseguí.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height)),
Elements(Points(X, Y, Legend(3)))
);
fb = Report(gb)[FrameBox(1)];
i = 0;
fb << Add Graphics Script(
Mousetrap(
If(i == 0,
x0 = x; y0 = y;
);
exx = x; exy = y;
i++;
,
i = 0;
show("RELEASED");
);
Rect(x0, y0, exx, exy);
);
Nombre Sin resolver: x0 en acceso o evaluación de 'x0', x0/*###*/
en la línea 24 en Script 2.jsl
No estoy muy familiarizado con la ratonera(); función, ¿no necesita 2x funciones internas?
Trampa del Ratón( RatónAbajo(x,y), RatónArriba(x,y)));
Sin embargo, quiero resolver esto porque creo que gran parte de mi retraso proviene de transmitir los puntos en listas 2x y luego seleccionar el primero y el último de esas listas.
Re: ¿Hay alguna manera de hacer que el controlador de estado de fila sea menos lento?Simplemente usaría el botón (eso es lo que he hecho), pero tal vez se podría construir algo con MouseTrap (¿o MouseBox?)
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height)),
Elements(Points(X, Y, Legend(3)))
);
fb = Report(gb)[FrameBox(1)];
i = 0;
fb << Add Graphics Script(
Mousetrap(
If(i == 0,
x0 = x; y0 = y;
);
exx = x; exy = y;
i++;
,
i = 0;
show("RELEASED");
);
Rect(x0, y0, exx, exy);
);Re: ¿Hay alguna manera de hacer que el controlador de estado de fila sea menos lento?Es súper lento.
Estoy tratando de transmitir solicitudes http desde JSL a un servidor web para generar un tablero en vivo en tiempo real basado en selecciones de jmp. Pensé que podría hacerlo con el controlador de estado de fila, pero es tan lento que mata la experiencia del usuario. Una vez que obtienes más de 500 puntos, el rendimiento cae en picado.
Lo que tengo ahora es hacer una selección en el gráfico, hacer clic en un botón y luego se muestra el informe http.
Quiero deshacerme de ese clic de botón.
Entonces, lo que estoy tratando de hacer ahora es enviar un lote de datos a mi servidor http para generar mi tablero. Al igual que un evento de javascript.
Re: ¿Hay alguna manera de hacer que el controlador de estado de fila sea menos lento?Para los scripts múltiples, puede hacerlo todo en un solo script y usar un valor faltante en firstX para desactivarlo. Aquí hay un truco q&d para agregar solo una copia de una segunda secuencia de comandos, o actualizar el gráfico si no se agrega, y aún usar su lógica para eliminarlo cuando haya terminado.
MouseDown = Function( {px, py},
Insert Into( lstX, pX );
Insert Into( lstY, pY );
firstX = lstX[1];
lastX = lstX[N Items( lstX )];
firstY = lstY[1];
lastY = lstY[N Items( lstY )];
// quick and dirty hack to only add the script once
If( N Items( ((Report( MY_GRAPH_BUILDER )[FrameBox( 1 )]) << XPath( "//TopSeg" )) << get script ) < 2,
(Report( MY_GRAPH_BUILDER )[FrameBox( 1 )]) << Add Graphics Script(
Line Style( "solid" );
Fill Color( "BlueGreen" );
Transparency( 0.3 );
Rect( firstX, firstY, lastX, lastY, 1 );
);
, // ELSE make sure to redraw using new values (might work without this)
(Report( MY_GRAPH_BUILDER )[FrameBox( 1 )]) << inval << updatewindow;
);
);
Re: ¿Hay alguna manera de hacer que el controlador de estado de fila sea menos lento?simplificar el selecciona donde expresión tanto como sea posible. No veo el retraso para 150 filas, pero para 100K filas es bastante malo. Esto me da una mejora de 10X:
do_normal_select = Function( {select_range},
{start, stop, sr1, sr2, sr3, sr4},
//show("normal_select");
start = HP Time();
sr1 = select_range[1];
sr2 = select_range[2];
sr3 = select_range[3];
sr4 = select_range[4];
dt << Select Where( sr1 <= :Sepal length <= sr2 & sr3 <= :Sepal width <= sr4 );
// dt << Select Where(
// AsColumn(:Sepal length) >= select_range[1]
// & AsColumn(:Sepal length) <= select_range[2]
// & AsColumn(:Sepal width) >= select_range[3]
// & AsColumn(:Sepal width) <= select_range[4]
// );
stop = HP Time();
Write( Eval Insert( "\!nselect where ^stop-start^" ) );
);
Hay tres cambios: eliminar AsColumn, sacar el subíndice del bucle implícito y encadenar el operador de comparación.
@Audrey_Shull - Desearía que el perfilador funcionara con esto. El generador de perfiles se detiene antes de que se abra la ventana, por lo que nunca puedo estudiar el tiempo dedicado a la selección interactiva.
Re: ¿Hay alguna manera de hacer que el controlador de estado de fila sea menos lento?¿Qué está tratando de hacer arrastrando en el cuadro de marco Graph Builder? Si se trata de seleccionar filas y luego responder, un controlador de estado de fila asociado con la tabla de datos debería ser suficiente.
Re: ¿Hay alguna manera de hacer que el controlador de estado de fila sea menos lento?Eliminar impresiones debería hacerlo más rápido, ocultar la tabla de datos también podría ayudar un poco. También puede ayudar verificar que se haya realizado algún cambio "real" entre dos eventos, pero dependiendo de la aplicación puede ser difícil de verificar.
Re: ¿Hay alguna manera de hacer que el controlador de estado de fila sea menos lento?Sí, siempre han sido difíciles de usar.
Necesito algo para obtener una respuesta en tiempo real, espero que el controlador de estado de fila esté retrasado porque estaba tratando de escribir en la consola y que podría ser más rápido para otras tareas.
Reescribir los criterios de selección funciona lo suficientemente bien para mi gráfico de dispersión, aunque es un poco tonto, por otro lado, a mis histogramas de distribución no parece gustarles.
Re: ¿Hay alguna manera de hacer que el controlador de estado de fila sea menos lento?Los diferentes controladores de estado son un desastre en JMP y, en mi opinión, deben evitarse si es posible. He creado un elemento de la lista de deseos para que se mejoren. Mejore los controladores de estado de JMP (etiqueta flotante, controlador de estado de fila, controlador de estado de filtro, programador, ...)