Haga que Filter Change Handler () se active solo después del segundo cambio de filtro, ¿por qué no primero?Utilizo Make Filter Change Handler () para cambiar dinámicamente el título del eje y en función de los cambios realizados por el usuario en el filtro de datos local. El script usa la solución por @hogi de aquí . Sin embargo, en mi caso de ejemplo (script a continuación) que representa mi caso real de cerca, el título del eje y cambia solo después de marcar la segunda casilla de verificación en "edad". ¿Cómo hacer que el mosaico del eje Y cambie en la primera selección de edad (estoy en JMP 16.2.0)?
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = Graph Builder(
Size( 855, 687 ),
Show Control Panel( 0 ),
Variables( X( :name ), Y( :age ), Group Y( :height ) ),
Elements( Points( X, Y, Legend( 37 ) ) ),
Local Data Filter(
Conditional,
Add Filter(
columns( :sex, :age ),
Where( :sex == "F" ),
Display( :sex, "Check Box Display" ),
Display( :age, "Check Box Display" )
)
),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( "" )} ),
Dispatch( {}, "Y title", TextEditBox, {Rotate Text( "Left" )} )
)
);
ldf = Current Report()["Local Data Filter"] << get scriptable object;
changeTitle = Function( {this},
print(this);
ldfText = Regex(ldf << get where clause(),"\( *(:age == .*?)\)","\1");
if(ismissing(ldfText),ldfText = "all ages");
(Report( gb ) << XPath( "//TextEditBox" ))[4] << Set Text( ldfText );
);
fsh = ldf << Make Filter Change Handler(
changeTitle();
);Automatización y secuencias de comandosRe: Hacer que el controlador de cambio de filtro () se active solo después del segundo cambio de filtro, ¿por qué no primero?La expresión regular que se usa no funciona si solo hay una edad seleccionada y dará como resultado "todas las edades".
Cláusula Where cuando solo se selecciona una edad
"Select Where(:sex == \!"F\!" & :age == 15)"
Cláusula Where cuando se selecciona más de una edad:
"Select Where(:sex == \!"F\!" & (:age == 14 | :age == 15))"
Tendrá que hacer ligeras modificaciones en el patrón de expresión regular
Editar:
Algo como esto podría funcionar https://regex101.com/r/Z6pg9N/1
Re: Hacer que el controlador de cambio de filtro () se active solo después del segundo cambio de filtro, ¿por qué no primero?@jthi Lo siguiente parece funcionar para mi caso de ejemplo anterior
ldfText = Regex(ldf << get where clause(),"\(?\s*(:age == .*?)\)","\1");
Sin embargo, para mi caso real, el cambio de secuencia de comandos anterior funciona solo cuando las casillas de verificación seleccionadas de manera predeterminada por Agregar filtro () dentro de Graph Builder() se desmarcan primero y luego se vuelven a marcar. Una vez que las estadísticas funcionan, todo está bien. ¿Qué podría estar mal?
Re: Hacer que el controlador de cambio de filtro () se active solo después del segundo cambio de filtro, ¿por qué no primero?Lo más probable es que el primer estado de filtro se ejecute antes de que se agregue el controlador de estado de filtro. Puede llamar a changeTitle() con una referencia al filtro de datos local para asegurarse de que la función se ejecute una vez que se haya creado el gráfico.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = Graph Builder(
Size( 855, 687 ),
Show Control Panel( 0 ),
Variables( X( :name ), Y( :age ), Group Y( :height ) ),
Elements( Points( X, Y, Legend( 37 ) ) ),
Local Data Filter(
Conditional,
Add Filter(
columns( :sex, :age ),
Where( :sex == "F" ),
Where(:age == 12),
Display( :sex, "Check Box Display" ),
Display( :age, "Check Box Display" )
)
),
SendToReport(
Dispatch( {}, "graph title", TextEditBox, {Set Text( "" )} ),
Dispatch( {}, "Y title", TextEditBox, {Rotate Text( "Left" )} )
)
);
ldf = Current Report()["Local Data Filter"] << get scriptable object;
changeTitle = Function( {this},
print(this);
ldfText = Regex(ldf << get where clause(),"\(?\s*(:age == .*?)\)","\1");
if(ismissing(ldfText),ldfText = "all ages");
(Report( gb ) << XPath( "//TextEditBox" ))[4] << Set Text( ldfText );
);
changeTitle(ldf); // to run the changeTitle() function once
fsh = ldf << Make Filter Change Handler(
changeTitle();
);Re: Hacer que el controlador de cambio de filtro () se active solo después del segundo cambio de filtro, ¿por qué no primero?@jthi . Llamar a Cambiar título () ya que su secuencia de comandos no cambió nada. Desafortunadamente, no puedo compartir mi script real (:.
Tenga en cuenta que la selección por primera vez muestra todos los filtros marcados en el eje y. Tal vez esto pueda proporcionar una pista sobre lo que está sucediendo.
Desmarcar todas las casillas de verificación y volver a marcarlas como se desee produce el resultado esperado.
Cualquier sugerencia será muy útil.
Re: Hacer que el controlador de cambio de filtro () se active solo después del segundo cambio de filtro, ¿por qué no primero?Ni idea. Tendrá que crear algún tipo de maqueta que pueda replicar el problema para facilitar la depuración