Script per aprire il filtro dati sulla colonna attualmente selezionata, con Trova e Regex abilitatiDivulgazione completa: non sono un programmatore e JSL mi dà un momento particolarmente difficile, tuttavia ritengo che questa parte della sceneggiatura che sto scrivendo dovrebbe essere molto più semplice di quanto non sia stata. Uso frequentemente il filtro dati, con "Trova" e "Espressioni regolari" abilitate (vedi immagine), tuttavia non esiste alcuna opzione per salvare queste impostazioni, quindi devono essere riattivate in modo ingombrante ogni volta che apro il filtro. Quello che vorrei è uno script di tabella incorporato che:
1) apre il filtro dati
2) aggiunge automaticamente la colonna attualmente selezionata (ovvero selezionerò una colonna, quindi avvierò lo script)
3) Abilita "Trova"
4) Abilita "Espressione regolare"

Sfortunatamente l'opzione di salvataggio dello script salva solo questo:
Current Data Table() << Data Filter(
Location( {630, 160} ),
Conditional,
Add Filter( columns( :name ), Display( :name, Size( 160, 225 ), List Display ) )
);Find e Regex non vengono salvati con lo script. . .
Ma, ecco la parte che mi ha costretto a chiedere aiuto, non riesco per la vita a capire come passare il nome della colonna attualmente selezionata alle funzioni "columns ()" e "Display ()".
Ho provato molte cose, per esempio questo:
Names Default to Here( 1 );
dt = Current Data Table( );
col_selected = dt << Get Selected Columns(string);
dt << Data Filter(
Location( {630, 160} ),
Conditional,
Add Filter( columns( col_selected ), Display( col_selected, Size( 160, 225 ), List Display ) )
);Ma ottengo un errore:
"Colonna specificata non trovata nella tabella dati. In accesso o valutazione di 'colonne', colonne (col_selected) /*###*/"
Probabilmente perché col_selected è un elenco, ma non riesco a capire come ottenere solo il nome dall'elenco di un elemento. Davvero non dovrebbe essere così difficile.
Ri: Script per aprire il filtro dati sulla colonna attualmente selezionata, con Trova e Regex abilitatiGrazie @Mark_Bailey anche questo funziona sebbene filtri solo la prima colonna se ne sono selezionati più. Tuttavia, l'utilizzo del tuo suggerimento per ottenere il riferimento alla colonna mi ha permesso di creare un ciclo FOR che fa esattamente quello che voglio.
Names Default to Here( 1 );
dt = Current Data Table( );
list = dt << Get Selected Columns( );
obj = dt << Data Filter( );
For( i = 1, i <= N Items( list ), i++,
obj << Add Filter( columns( Column( list[i] ) )
)
);
Ri: Script per aprire il filtro dati sulla colonna attualmente selezionata, con Trova e Regex abilitatiIn questo modo è contorto. Non è l'unico modo che funziona, però. Le espressioni sono potenti costruttori ma non sono sempre necessarie. Tieni presente che l'argomento Columns() prevede un riferimento a una colonna. Questo è tutto quello che c'è da fare. Potrebbe essere un valore letterale (nome di colonna), un valore memorizzato in una variabile o un valore restituito da una funzione.
Names Default to Here( 1 );
// open example data table
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// select a column (mimic result by interactive user)
dt << Go To( :age );
// identify selection
col = dt << Get Selected Columns( String );
// obtain column reference
col = Column( col[1] );
// launch data filter on selected column
df = dt << Data Filter(
Add Filter( Columns( col ) )
);
Ri: Script per aprire il filtro dati sulla colonna attualmente selezionata, con Trova e Regex abilitati@ionatx Sono con te.Ho lottato con questo da solo e alla fine ho trovato la soluzione qui sui forum.La mia comprensione approssimativa è che devi affrontare tutta questa trafila per inserire un'espressione in un'altra espressione. Con il tuo codice originale, col_selected non è mai stato valutato.Data Filter() ha visto solo i caratteri "col_selected" che non ha riconosciuto come titolo di colonna, quindi ha restituito l'errore " Colonna specificata non trovata nella tabella dati ".Quindi lo racchiudi all'interno di Expr() che significa che è un'espressione che deve essere valutata.Quindi racchiudi l'intera cosa all'interno di Eval Expr() per forzare la valutazione delle cose che sono racchiuse all'interno di Expr().Quindi avvolgi un Eval() attorno all'intero espressione che essenzialmente esegue l'espressione per produrre l'output desiderato.Sembra tutto molto contorto, ma è così che funziona.
Volete saperne di più?https://community.jmp.com/t5/JSL-Cookbook/Insert-one-expression-into-another-using-Eval-Insert-Eval-Expr/ta-p/48998
Ri: Script per aprire il filtro dati sulla colonna attualmente selezionata, con Trova e Regex abilitati@Chris_Rodrigues ha funzionato, non capisco Perché ha funzionato, ma ha funzionato.
@Jeff_Perkinson grazie per il seguito, e sì, lo farò.
Ri: Script per aprire il filtro dati sulla colonna attualmente selezionata, con Trova e Regex abilitati@Chris_Rodrigues ha un controllo su come ottenere la variabile da valutare all'interno del messaggio Data Filter() e posso confermare che non esiste alcun supporto JSL per attivare le opzioni Find e Regex.
Se ritieni che sarebbe prezioso, assicurati di inserirlo nel file Lista dei desideri JMP .
Ri: Script per aprire il filtro dati sulla colonna attualmente selezionata, con Trova e Regex abilitatiPer passare una variabile come col_selected alla funzione Filtro dati, devi utilizzare il costrutto Eval(Eval Expr(Expr())).JSL è così strano.Ma ecco come appare:
Names Default to Here( 1 );
dt = Current Data Table( );
col_selected = dt << Get Selected Columns(string);
Eval(
Eval Expr(
dt << Data Filter(
Location( {630, 160} ),
Conditional,
Add Filter( columns( Expr(col_selected) ), Display( Expr(col_selected), Size( 160, 225 ), List Display ) )
);
)
);Per le opzioni Trova e Regex... Dubito che sia anche possibile.Se guardi la documentazione di Data Filter() nella guida allo scripting non c'è alcuna menzione di queste opzioni.Dubito che l'interfaccia di scripting abbia quel livello di granularità e quelle caselle di spunta possono essere visualizzate solo in modo interattivo.Potrei sbagliarmi, però.Qualcun altro potrebbe intervenire con una soluzione per questo.