Usa la variabile di colonna nell'espressione IFGentile Comunità,
Di seguito, sto usando diverse variabili portate da una finestra di dialogo:
- colSelect: la colonna da analizzare
- quantVal1 e quantVal2: valori quantili
Nel seguente pezzo di script, sto creando una colonna "Categorie", che verrà poi tabulata per ottenere importi per ogni quantile.
Due problemi:
- la sostituzione del nome della colonna hardcodedl con un metodo Eval() non funziona
- come posso verificare se la colonna esiste già e, in caso affermativo, aggiornare la sua formula?
Ciò consentirebbe di aggiornare l'intero processo di analisi con nuove colonne e quantili, senza dover ricominciare da capo caricando ed elaborando la tabella dei dati.
//Custom Quantiles amounts
dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( Eval( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= quantVal1,
1,
If( Eval( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= quantVal2,
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
);Grazie!
ScriptingRi: Usa la variabile di colonna nell'espressione IFUn leggero svantaggio di questo codice: le variabili nella Formula non verranno più definite in un secondo momento.
Questo può essere visto dalle oscillazioni rosse nell'editor di formule:

Il risultato: quando un valore nella tabella cambia in futuro, la colonna non verrà aggiornata automaticamente.
Un codice più robusto può essere generato con un approccio da cui ho imparato @jthi :
Mettere NomeEspr(Come Colonna()) dentro Espr() .
Quindi la formula sarà simile a questa:

e i valori delle colonne verranno aggiornati in futuro se i valori di input vengono aggiornati 
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect ="age";
quantVal1 = 13;
quantVal2 = 16;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( Expr( NameExpr(As Column(dt, colSelect)) )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal1),
1,
If( Expr( Name Expr(As Column(dt, colSelect)) )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal2),
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
dt:age[12]=40;
Ri: Usa la variabile di colonna nell'espressione IFGrazie ancora Byron,
Dopo aver provato entrambi e aver letto alcuni dei collegamenti forniti, è stato finalmente un mix di entrambi che ha funzionato: AsColumn ()
Ringrazia tutti!
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect = "age";
quantVal1 = 13;
quantVal2 = 16;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( AsColumn( colSelect )/*:age*/ <= quantVal1,
1,
If( AsColumn( colSelect )/*:age*/ <= quantVal2,
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
colList = dt << Get Column Names("String");
Show(Contains(colList, "Categories")); //will return indexRi: Usa la variabile di colonna nell'espressione IFmagari guarda anche questi due argomenti:
Colonna()
Come nome()
lo script potrebbe tentare di analizzare ColSelect come stringa di testo anziché come nome di colonna
Ri: Usa la variabile di colonna nell'espressione IFGrazie mille Jarmo,
Ho soluzioni parziali nella tua risposta.
Tuttavia, il trucco colSelect funziona solo con un determinato valore numerico, non con un nome di colonna (dimenticato di menzionare)
Grazie al tuo esempio, ecco di più come sarebbe (Expr (colSelect) non funzionante in questo contesto aggiornato):
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect = "age";
quantVal1 = 13;
quantVal2 = 16;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( /*Expr( colSelect )*/:age <= quantVal1,
1,
If( /*Expr( colSelect )*/:age <= quantVal2,
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
colList = dt << Get Column Names("String");
Show(Contains(colList, "Categories")); //will return index
Ri: Usa la variabile di colonna nell'espressione IFCiao Byron,
Show(colSelect) restituisce una semplice stringa, non un elenco (me ne sono occupato quando ho passato gli argomenti di Dialog):
colSelect = "Tempo totale dal check-in all'uscita";
Esplorerò questo PDF, grazieRi: Usa la variabile di colonna nell'espressione IFpoiché ColSelect proviene da una finestra di dialogo, potrebbe infatti essere un elenco di un elemento.
Se valuti ColSelect, cosa viene restituito? se è {:colname}, allora è un elenco di un elemento
Prova a valutare ColSelect[1], se proviene da un elenco, verrà restituito :colname.
In questo caso eval() restituisce la lista.
dai un'occhiata anche a Eval list()
c'è un pdf che è SUPER utile per comprendere le espressioni allegate a questo post.
Funzioni di gestione delle espressioni: Parte I - Svelare Expr(), NameExpr(), Eval(), ... Enigma
Ri: Usa la variabile di colonna nell'espressione IF1. Buona discussione su come sostituire i valori nella formula:
Inserisci un'espressione in un'altra usando Eval Insert, Eval Expr, Parse e Substitute
Se non hai bisogno di una formula, ti suggerisco di usare << Imposta ogni valore.
2. È possibile ottenere l'elenco dei nomi delle colonne con dt << Ottieni nomi colonne ("Stringa") e utilizzare Contains () per verificare la presenza di colonne in tale elenco
Questo dovrebbe funzionare:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
colSelect = 1;
quantVal1 = 1;
quantVal2 = 2;
//Custom Quantiles amounts
Eval(Eval Expr(dt << New Column( "Categories",
Numeric, "Continuous",
Format( "Best", 9 ),
Formula(
If( Expr( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal1),
1,
If( Expr( colSelect )/*:Total Time From CheckIn Collector To Exit*/ <= Expr(quantVal2),
2,
3
)
)
),
Set Property( "Value Order", {} ),
Set Property(
"Color Gradient",
{{"Green to Orange to Red", 4099, {{0, 227, 0}, {255, 255, 0}, {252, 11, 11}}, {0, 0.5, 1}}, Range( {1, 3, 1} )}
),
Color Cell by Value,
Set Display Width( 74 )
)));
colList = dt << Get Column Names("String");
Show(Contains(colList, "Categories")); //will return index