Sorgen Sie dafür, dass Filter Change Handler() erst nach dem zweiten Filterwechsel ausgelöst wird. Warum nicht zuerst?Ich verwende den Make Filter Change Handler (), um den Titel der Y-Achse basierend auf den vom Benutzer am lokalen Datenfilter vorgenommenen Änderungen dynamisch zu ändern. Das Skript verwendet die Lösung von @hogi aus Hier . In meinem Beispielfall (Skript unten), der meinen tatsächlichen Fall genau darstellt, ändert sich der Titel der Y-Achse jedoch erst, nachdem das zweite Kontrollkästchen auf „Alter“ aktiviert wurde. Wie kann ich die Y-Achsen-Kachel bei der ersten Altersauswahl ändern (ich verwende 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();
);Automatisierung und SkripterstellungBetreff: Filter Change Handler () erst nach dem zweiten Filterwechsel auslösen lassen, warum nicht zuerst?Der verwendete reguläre Ausdruck funktioniert nicht, wenn nur ein Alter ausgewählt ist, und das Ergebnis ist „alle Altersgruppen“.
Where-Klausel, wenn nur ein Alter ausgewählt ist
"Select Where(:sex == \!"F\!" & :age == 15)"
Wo-Klausel, wenn mehr als ein Alter ausgewählt wird:
"Select Where(:sex == \!"F\!" & (:age == 14 | :age == 15))"
Sie müssen geringfügige Änderungen am Regex-Muster vornehmen
Bearbeiten:
So etwas könnte funktionieren https://regex101.com/r/Z6pg9N/1
Betreff: Filter Change Handler () erst nach dem zweiten Filterwechsel auslösen lassen, warum nicht zuerst?@jthi Das Folgende scheint für meinen obigen Beispielfall zu funktionieren
ldfText = Regex(ldf << get where clause(),"\(?\s*(:age == .*?)\)","\1");
In meinem konkreten Fall funktioniert die obige Skriptänderung jedoch nur, wenn die standardmäßig ausgewählten Kontrollkästchen durch Add Filter () in Graph Builder() zunächst deaktiviert und dann erneut aktiviert werden. Sobald es funktioniert, ist alles in Ordnung. Was könnte falsch sein?
Betreff: Filter Change Handler () erst nach dem zweiten Filterwechsel auslösen lassen, warum nicht zuerst?Höchstwahrscheinlich wird der erste Filterstatus ausgeführt, bevor der Filterstatus-Handler überhaupt hinzugefügt wird. Sie können changeTitle() mit einem Verweis auf den lokalen Datenfilter aufrufen, um sicherzustellen, dass die Funktion einmal ausgeführt wird, nachdem das Diagramm erstellt wurde
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();
);Betreff: Filter Change Handler () erst nach dem zweiten Filterwechsel auslösen lassen, warum nicht zuerst?@jthi . Der Aufruf von Change Title(), da Ihr Skript nichts geändert hat. Leider kann ich mein aktuelles Skript nicht teilen (:.
Beachten Sie, dass bei der ersten Auswahl alle aktivierten Filter auf der Y-Achse angezeigt werden. Vielleicht gibt das einen Hinweis darauf, was los ist.
Das Deaktivieren aller Kontrollkästchen und das erneute Aktivieren dieser Kontrollkästchen führt zum erwarteten Ergebnis.
Alle Vorschläge werden sehr nützlich sein.
Betreff: Filter Change Handler () erst nach dem zweiten Filterwechsel auslösen lassen, warum nicht zuerst?Keine Ahnung. Sie müssen eine Art Modell erstellen, das das Problem reproduzieren kann, um das Debuggen zu erleichtern