Parte dello script che non viene eseguita a meno che non venga eseguita successivamenteHo una parte dello script che sto utilizzando per ricodificare le colonne nella mia tabella per modificare i valori da "X" a 0. Sono riuscito a far funzionare questa porzione di codice (grazie forum di discussione JMP!!) quando eseguita separatamente dal mio script principale. Tuttavia, quando lo inserisco in uno script più grande (anche alla fine) JMP non esegue il mio comando. Quando il codice è stato inserito al centro del mio script, tutto dopo non è stato eseguito... quindi l'ho spostato in fondo allo script principale ma continua a non essere eseguito. Ogni volta che evidenzio questa parte e la eseguo dopo il fatto, fa esattamente quello che voglio.
Ho provato a implementare wait(0);, passando da i a k e utilizzando anche un'istruzione Try attorno a For Each Row, ma senza fortuna. Mi sto davvero grattando la testa sul motivo per cui funzionerebbe solo dopo il fatto. Suggerimenti?
//Recode columns in Yield Table to give "0" instead of X's
wait(0);
yieldcols = Yields << get column names;
For Each Row( For( k = 1, k <= N Items( yieldcols ), k++,
If( Is Missing( As Column( yieldcols[k] )[] ),
As Column( yieldcols[k] )[] = 0 ) ) );
Modellazione statistica avanzataAutomazione e scriptingCombinazione e pulizia dei datiProgettazione di esperimentiPersonalizzazione di massaRi: Parte dello script non eseguita a meno che non venga eseguita dopo il fattoCIAO,
Non sono sicuro del motivo per cui il codice che ho fornito non funziona per te. Potresti provare quanto segue:
1) Esegui il codice originale che ho fornito, da solo, in una nuova finestra. Funziona? In caso contrario, quale versione di JMP stai utilizzando? L'indicizzazione diretta delle tabelle di dati è stata aggiunta alcune versioni fa, ma non è presente in JMP 12, ad esempio.
2) Supponendo che 1) sopra funzioni, il passaggio successivo è sostituire tutte le istanze di "dt" con "yields", eseguire solo il nuovo codice nella nuova finestra. Questo ha funzionato per me e mi aspetto che funzioni per te se 1) ha funzionato per te.
Names Default To Here(1);
//create a table with roughly 10% missingness
yields = astable(J(1e5,5,randominteger(1, 20)/(randomuniform() > 0.1)));
For( i = 1, i <= N Col( yields ), i++,
yields[Loc( Is Missing( yields[0, i] ) ), i] = 0
);
3) Se i dati nella tabella sono basati su formule, le formule potrebbero essere state "scritte" nella colonna, ma potrebbero non essere state completate la valutazione, nel momento in cui inizia l'esecuzione del JSL destinato a correggere i dati mancanti. Assicurati che tutte le formule siano completamente aggiornate, prima che il codice venga eseguito, facendo precedere il codice da questa riga:
Yields << run formulas;
4) Assicurati che "Rendimenti" non faccia riferimento a nient'altro oltre alla tabella dati di interesse... non a un nome di colonna, a un altro nome di variabile, a una variabile di tabella, ecc. Per questo motivo, come buona pratica, consiglio di utilizzare "dt" da qualche parte in qualsiasi nome di variabile utilizzato per puntare a una tabella; mentre è facile immaginare di sovrascrivere un handle di tabella "Yields" nominando inavvertitamente una matrice o un vettore di valori "Yields", è molto meno probabile denominare accidentalmente tale matrice o vettore "YieldDt". Tuttavia, poiché il tuo programma funziona se metti in pausa l'esecuzione, non credo che questo sia il problema.
Se 1) e 2) funzionano per te e né 3) né 4) risolvono il problema, avrò bisogno di ulteriori informazioni per aiutarti: una tabella di esempio ripulita e uno snippet di codice che può essere eseguito su quella tabella per dimostrare che il la sostituzione non funziona su quella tabella.
Saluti,
Brady
Ri: Parte dello script non eseguita a meno che non venga eseguita dopo il fattoCiao Mark. Ora funziona separatamente ma non funziona come una parte più piccola del mio script più grande. Mi chiedo se questo non sia meno un problema di scripting, più un altro problema. Perché una sezione di codice dovrebbe funzionare se eseguita da sola e fallire se eseguita come una parte più piccola di uno script più grande (anche se eseguita per ultima come nel primo scenario)?Ri: Parte dello script non eseguita a meno che non venga eseguita dopo il fattoCiao Brady,
Apprezzo tutti i consigli e l'aiuto. Tuttavia, questa sezione di codice che hai fornito non sembra funzionare per me (dopo aver cambiato il nome della tabella). Lo trovo molto strano: non vedo alcun motivo per cui non funzionerebbe. Qualche idea?
For( i = 1, i <= N Col( Yields ), i++,
Yields[Loc( Is Missing( Yields[0, i] ) ), i] = 0
);
Riformulando un po' la mia domanda: il codice che ho attualmente funziona se eseguito separatamente, ma non quando eseguito come una piccola sezione di un codice più grande . Lo trovo strano di per sé. Sto bene con la modifica del mio codice, è solo che a me non sembra essere il problema, perché (anche se non "perfetto") funziona! Potrebbe trattarsi di un bug? Oppure ci sono modi per risolvere questo problema? Non ho errori neanche durante il debug.
Ri: Parte dello script non eseguita a meno che non venga eseguita dopo il fattoInoltre, se hai molte righe o colonne, associa nrows (dt) o ncols (dt) a una variabile e usala come indice superiore, quindi non è necessario che nrow(dt) o ncol(dt) siano valutati ad ogni iterazione.
//do some stuff
);nc = ncol (dt);
for (i = 1, i<=nc, i++,
JMP 16 consente di eseguire questa operazione con un ciclo for each(), da non confondere con ogni riga( ). For Each() presenta alcuni altri vantaggi rispetto ai cicli for() di base, come l'ambito locale delle variabili e in alcuni casi un'esecuzione più rapida. Se stai utilizzando JMP 16, assicurati di provarlo.
for each ( { i }, 1::nrow( dt ),
//do some stuff
);
Ri: Parte dello script non eseguita a meno che non venga eseguita dopo il fattoInoltre, vorrei essere il primo ad ammettere che non utilizzo mai For Each Row().
Mai.
Nemmeno se i bambini mangiano gratis.
Se devo eseguire il loop sulle righe (cosa che cerco di evitare, catturando i valori di una colonna tutti in una volta o indicizzandoli direttamente come faccio in questo esempio, utilizzando << ottieni valori e utilizzando l'elenco o la matrice risultante, ecc.) , Scrivo un ciclo for ( ).
Non sto dicendo che For Each Row ( ) non funzioni mai. Sto dicendo che viene fornito con degli avvertimenti e non so quali siano questi avvertimenti. Quindi evito For Each Row ( ) come la peste e consiglio ad altri di fare lo stesso, a meno che entrambi 1) non siano disposti ad apprendere gli avvertimenti e 2) siano disposti a presumere che coloro che modificano, mantengono o interagiscono in altro modo con il codice in il futuro farà altrettanto.
Quest'ultima cosa è così improbabile che non ho mai pensato di intraprendere la prima.
Saluti,
Brady
for (i =1, i<=nrow(dt), i++,
//do some stuff
);
Ri: Parte dello script non eseguita a meno che non venga eseguita dopo il fattoCIAO,
Se le prestazioni su tabelle di grandi dimensioni sono un problema, potresti provare quanto segue (nota, ho usato dt come nome della tabella). Su una tabella moderata (100.000 righe x 5 colonne) la differenza di prestazioni è evidente sulla mia macchina, a 0,0056 secondi contro 0,8261 secondi. Questo per un paio di motivi:
Innanzitutto, le funzioni Loc ( ) e Is Missing ( ) sono veloci, anche se utilizzate su un'intera colonna contemporaneamente, che è ciò che stiamo facendo qui. Cioè, dt[0, i] recupera l'intera colonna i.
Inoltre, indicizzando direttamente le colonne, non dobbiamo preoccuparci di ottenere i loro nomi o di recuperarle dall'elenco che le contiene.
Saluti,
Brady
Names Default To Here(1);
//create a table with roughly 10% missingness
dt = astable(J(1e5,5,randominteger(1, 20)/(randomuniform() > 0.1)));
For( i = 1, i <= N Col( dt ), i++,
dt[Loc( Is Missing( dt[0, i] ) ), i] = 0
);
Ri: Parte dello script non eseguita a meno che non venga eseguita dopo il fatto//Recode columns in Yield Table to give "0" instead of X's
yieldcols = Yields << get column names;
For( col = 1, col <= N Items( yieldcols ), col++,
For Each Row( If( Is Missing( As Column( yieldcols[col] )[] ), As Column( yieldcols[col] )[] = 0 ) )
);
Ri: Parte dello script non eseguita a meno che non venga eseguita dopo il fattoHo appena fatto un tentativo. Questo non funziona, anche se eseguito separatamente. Lo script originale che ho funziona, ma solo se eseguito separatamente (dopo il fatto, dopo che l'intero script è stato eseguito e ho premuto Ctrl+R quella sezione).Ri: Parte dello script non eseguita a meno che non venga eseguita dopo il fatto//Recode columns in Yield Table to give "0" instead of X's
yieldcols = Yields << get column names;
For( col = 1, col <= N Items( yieldcols ), col++,
For Each Row( If( Is Missing( As Column( yieldcols[k] )[] ), As Column( yieldcols[k] )[] = 0 ) )
);