C'è un modo per chiamare una funzione utente con diversi filtri di rigaScusate. Non so come descriverlo al meglio nel titolo, ma cercherò di illustrare ciò che ho attualmente e ciò che volevo ottenere:
Ciò che ho:
Quindi ho questa funzione che calcola per Col Min, Max e Mean
col_stats = Function( { COL_NAME }, {},
curr_dt = Cuurent Data Table();
min_val = Col Min ( curr_dt:Eval(COL_NAME));
max_val = Col Max ( curr_dt:Eval(COL_NAME));
mean_val = Col Mean ( curr_dt:Eval(COL_NAME));
Eval List({min_val, max_val, mean_val});
);Cosa voglio ottenere:
Voglio essere in grado di chiamare la funzione col_stat, filtrando i dati usando la combinazione di un determinato elenco o elenchi.
Il numero di elenchi può cambiare in base all'utente, per l'esempio seguente selezionare temp e vcc (l'utente può aggiungere frequenza ecc.)
temperature = {-40, 0, 25, 100};<BR />vcc = {1.2, 1.26, 1.32};Voglio essere in grado di ottenere il Min Max Mean usando la funzione col_stat per
-40 e 1,20 V.
-40 e 1,26 V.
e così via.
Se il numero di elenchi è noto, so che posso fare un doppio per il ciclo per scorrere attraverso la combinazione di due elenchi ma voglio espanderlo in modo tale che l'utente possa aggiungere altro elenco
Spero di averlo spiegato bene.
ScriptingRi: C'è un modo per chiamare una funzione utente con diversi filtri di rigaA mio avviso, è necessario apportare una modifica piuttosto semplice alla funzione per farlo funzionare solo sulle righe selezionate nella tabella dei dati. Show () con la chiamata alla funzione presuppone che la tabella di dati Big Class sia aperta.
col_stats = Function( {dt, COL_NAME},
{defaultlocal},
min_val = Col Min( If( Selected( Row State( Row() ) ), column(dt, COL_NAME ), . ) );
max_val = Col Max( If( Selected( Row State( Row() ) ), column(dt, COL_NAME ), . ) );
mean_val = Col Mean( If( Selected( Row State( Row() ) ), column(dt, COL_NAME ), . ) );
Return( Eval List( {min_val, max_val, mean_val} ) );
);
show(col_stats(dt,"height"));
Effettuando i calcoli solo sulle righe selezionate, è possibile utilizzare la funzionalità di
dt << Seleziona Where ()
per definire qualsiasi combinazione di elementi desideri, quindi chiamare la funzione e ottenere i risultati.
E non devi forzare tutto in un singolo Seleziona dove. Se guardi la definizione di Select Where, vedrai che puoi costruire dinamicamente la tua selezione complessiva finale passando diverse clausole Select Where () e specificando se espandere il contratto dalla selezione corrente. (Es. Se al momento sono selezionate tutte le righe con -40, puoi dire a JMP di aggiungere l'ulteriore qualifica di "solo il vcc di 1.20)
Ri: C'è un modo per chiamare una funzione utente con diversi filtri di rigaUtilizzare un ciclo nidificato per: {{temperature}, {vccs}}?
Ri: C'è un modo per chiamare una funzione utente con diversi filtri di riga
Se stai usando una clausola Where, potresti trovare un po 'più veloce per ottenere i valori per le righe di interesse e usare i metodi matrix:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col_stats = Function( {dt, rows, COL_NAME},
{defaultlocal},
vals = column(dt, COL_NAME )[rows];
min_val = Min( vals );
max_val = Max( vals );
mean_val = Mean( vals );
Return( Eval List( {min_val, max_val, mean_val} ) );
);
show(col_stats(dt, dt<<GET rows="" where=""></GET>
Questo compensa un po 'di memoria per la velocità - Hai due vettori extra, ma non richiede alcun loop o condizionali nella valutazione JSL.
Ri: C'è un modo per chiamare una funzione utente con diversi filtri di rigaFare un loop nidificato richiederebbe una codifica rigida di due loop for per i due elenchi, giusto?
Vorrei evitarlo, perché se l'utente aggiungesse più elenco di filtri come freq = {10, 20, 30} allora non funzionerebbe, giusto?
Mi piacerebbe che funzionasse in modo simile al "By" in Distribution se aggiungessi temp, wafer, vcc nell'elenco "By" genererebbe la distribuzione di tutte le combinazioni di temp, wafer e vcc. Ma mi piace lavorare con la mia funzione.