Filtro dati interrotto in un ciclo forSto scrivendo uno script for-loop per cercare i valori x dei picchi y-massimi in alcune parti degli spettri raccolti in diverse condizioni sperimentali. Tuttavia, il filtro dati si è fermato dopo aver eseguito un round con l'avviso "La tua selezione è stata modificata in un'altra finestra". Come posso eliminare questo avviso in modo che lo script possa essere eseguito senza problemi per completare il for-loop?
Lasciatemi usare l'esempio Big Class.jmp per dimostrare il problema. L'obiettivo è mostrare il sottoinsieme di dati corrispondente alle persone con il peso massimo (valore massimo y) in diversi intervalli di altezze (intervalli di valori x, diciamo 55-60, 60-62, 62-65) per età diverse (simili alle condizioni sperimentali).
Gli intervalli di valori x sono raggruppati in due elenchi, uno contenente i limiti inferiori e l'altro i limiti superiori. Il massimo è trovato da Col Maximum con Data Filter. Il calcolo è ripetuto per diversi intervalli di valori x lungo gli elenchi. Tuttavia, dopo l'esecuzione per i=1, il ciclo si interrompe e appare l'avviso Data Filter. Come liberarsene per consentire allo script di completare il ciclo for?
Names Default To Here( 1 );
ListA = {55, 60, 62};
ListB = {60, 62, 65};
for(i=1, i<=3, i++,
dt = Data Table( "Big Class" );
Current Data Table (dt);
a = ListA[i];
b = ListB[i];
dt << Data Filter(Add Filter(columns(:height), where(:height > a & :height < b)), Mode( Select( 0 ), Show( 0 ), Include( 1 )), Show Window(0), Auto Clear(1));
dt << select where (col maximum(:weight, :age, Excluded()) == :weight & :height > a & :height < b);
dt << subset(selected rows(1), columns({"name", "age", "sex", "height", "weight"}));
dt << Clear Row States;
dt << Clear Select();
);
Automazione e scriptingRe: Filtro dati interrotto in un ciclo forCredo che il JSL semplificato riportato di seguito ti dia ciò che desideri.
Names Default To Here( 1 );
dt =
// Open Data Table: semiconductor capability.jmp
// → Data Table( "semiconductor capability" )
Open( "$SAMPLE_DATA/big class.jmp" );
ListA = {55, 60, 62};
ListB = {60, 62, 65};
For( i = 1, i <= 3, i++,
a = ListA[i];
b = ListB[i];
Current Data Table( dt );
theMax = Col Maximum( If( :weight & :height > a & :height < b, :weight, . ) );
dt << select where( theMax == :weight & :height > a & :height < b );
If( N Rows( dt << get selected rows ) > 0,
dt << subset( selected rows( 1 ), columns( {"name", "age", "sex", "height", "weight"} ) )
);
dt << Clear Row States;
Wait( 0 );
);Re: Filtro dati interrotto in un ciclo forTuttavia, questo script non ha la funzione "by age". Ad esempio, nel mio script, quando i = 2 (ListA = 60, ListB = 62), il risultato è
| Nome | Età | Sesso | Altezza | Peso |
| GIACOMO | 12 | M | 61 | 128 |
| ALICE | 13 | F | 61 | 107 |
| GIUDICA | 14 | F | 61 | 81 |
Tuttavia, il tuo script fornisce la parte corrispondente come
| Nome | Età | Sesso | Altezza | Peso |
| GIACOMO | 12 | M | 61 | 128 |
Questo perché il mio script ha la parte "by age" in Col Maximum. Sfortunatamente, anche se aggiungo la parte "by age" nel tuo script:
theMax = Col Maximum( If( :weight & :height > a & :height < b, :weight, . ), :age );
Appare un avviso: "Numero di riga non valido"
Il tuo script funziona senza problemi. Come possiamo aggiungere la parte "by age" in Col Maximum nel tuo script?
Re: Filtro dati interrotto in un ciclo forDate un'occhiata alla documentazione di Col Max: in realtà può fare tutto il lavoro necessario.
Basta usare una colonna ausiliaria height_bin (ad esempio tramite Trasforma Colonna). Non c'è bisogno di un filtro dati...

secondo questa tabella, sono James, Barbara, Judy e Marion.
Se si desidera definire height_bins tramite un filtro dati, assicurarsi di non tralasciare i punti di giunzione, ad esempio height=60.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "height_bin",
"Character",
Formula(
If(
:height < 60, "<60",
:height <62, "<62",
">=62"
)
) );
New Column( "weight_max",
Formula( Col Maximum( :weight, :age, :height_bin ) )
);
New Column( "is max",nominal,
Formula( :weight == :weight_max ),
);
Graph Builder(
Variables( X( :age ), Y( :weight ), Group Y( :height_bin ) ),
Elements( Bar( X, Y, Label( "Label by Row" ) ) ),
Local Data Filter( Add Filter( columns( :is max ), Where( :is max == 1 ) ) )
);