Fai in modo che Filter Change Handler () si attivi solo dopo la seconda modifica del filtro, perché non prima?Uso Make Filter Change Handler () per modificare dinamicamente il titolo dell'asse y in base alle modifiche apportate dall'utente sul filtro dati locale. Lo script utilizza la soluzione di @hogi da Qui . Tuttavia, nel mio caso di esempio (script sotto) che rappresenta da vicino il mio caso reale, il titolo dell'asse y cambia solo dopo che la seconda casella di controllo è selezionata su "età". Come modificare la tessera dell'asse y alla prima selezione dell'età (sono su 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();
);Automazione e scriptingRe: Make Filter Change Handler () che si attiva solo dopo la seconda modifica del filtro, perché non prima?L'espressione regolare utilizzata non funziona se è selezionata solo un'età e risulterà in "tutte le età".
Clausola Where quando viene selezionata solo un'età
"Select Where(:sex == \!"F\!" & :age == 15)"
Clausola Where quando sono selezionate più età:
"Select Where(:sex == \!"F\!" & (:age == 14 | :age == 15))"
Dovrai apportare lievi modifiche al pattern regex
Modificare:
Qualcosa del genere potrebbe funzionare https://regex101.com/r/Z6pg9N/1
Re: Make Filter Change Handler () che si attiva solo dopo la seconda modifica del filtro, perché non prima?@jthi Quanto segue sembra funzionare per il mio caso di esempio sopra
ldfText = Regex(ldf << get where clause(),"\(?\s*(:age == .*?)\)","\1");
Tuttavia, per il mio caso reale, la modifica dello script di cui sopra funziona solo quando le caselle di controllo predefinite selezionate da Aggiungi filtro () all'interno di Graph Builder () vengono prima deselezionate e quindi riselezionate. Una volta che funziona, tutto va bene. Cosa potrebbe esserci di sbagliato?
Re: Make Filter Change Handler () che si attiva solo dopo la seconda modifica del filtro, perché non prima?Molto probabilmente il primo stato del filtro viene eseguito prima ancora che venga aggiunto il gestore dello stato del filtro. Puoi chiamare changeTitle() con un riferimento al filtro dati locale per assicurarti che la funzione venga eseguita una volta dopo che il grafico è stato creato
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: Make Filter Change Handler () che si attiva solo dopo la seconda modifica del filtro, perché non prima?@jthi . Chiamare Change Title () poiché il tuo script non ha cambiato nulla. Sfortunatamente non posso condividere il mio script effettivo (:.
Notare che la prima selezione temporale mostra tutti i filtri selezionati sull'asse y. Forse questo può fornire un suggerimento su cosa sta succedendo.
Deselezionando tutte le caselle di controllo e riselezionandole come desiderato si ottiene il risultato previsto.
Qualsiasi suggerimento sarà molto utile.
Re: Make Filter Change Handler () che si attiva solo dopo la seconda modifica del filtro, perché non prima?Nessuna idea. Dovrai creare una sorta di mock-up in grado di replicare il problema per semplificare il debug