Filtre de données arrêté dans une boucle forJ'écris un script de boucle for pour rechercher les valeurs x des pics y-maximum dans certaines parties des spectres collectés dans différentes conditions expérimentales. Cependant, le filtre de données s'est arrêté après avoir exécuté un tour par l'avertissement « Votre sélection a été modifiée dans une autre fenêtre ». Comment puis-je me débarrasser de cet avertissement afin que le script puisse être exécuté sans problème pour terminer la boucle for ?
Je vais utiliser l'exemple de Big Class.jmp pour illustrer le problème. L'objectif est de montrer le sous-ensemble de données correspondant aux personnes ayant le poids maximum (valeur y maximale) dans plusieurs plages de tailles (plages de valeurs x, par exemple 55-60, 60-62, 62-65) à différents âges (de manière similaire aux conditions expérimentales).
Les plages de valeurs x sont regroupées par deux listes, l'une contenant les limites inférieures et l'autre les limites supérieures. Le maximum est trouvé par Col Maximum avec Data Filter. Le calcul est bouclé pour plusieurs plages de valeurs x le long des listes. Cependant, après avoir exécuté pour i=1, la boucle s'arrête et l'avertissement Data Filter apparaît. Comment s'en débarrasser pour laisser le script terminer la boucle 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();
);
Automatisation et scriptsRe: Filtre de données arrêté dans une boucle forJe pense que le JSL simplifié ci-dessous vous donne ce que vous voulez.
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: Filtre de données arrêté dans une boucle forCependant, ce script ne dispose pas de la fonction "par âge". Par exemple, dans mon script, lorsque i = 2 (ListeA = 60, ListeB = 62), le résultat est
| Nom | Âge | Sexe | Hauteur | Poids |
| JACQUES | 12 | M | 61 | 128 |
| ALICE | 13 | F | 61 | 107 |
| JUDY | 14 | F | 61 | 81 |
Cependant, votre script donne la partie correspondante comme
| Nom | Âge | Sexe | Hauteur | Poids |
| JACQUES | 12 | M | 61 | 128 |
C'est parce que mon script contient la partie "par âge" dans Col Maximum. Malheureusement, même si j'ajoute la partie "par âge" dans votre script :
theMax = Col Maximum( If( :weight & :height > a & :height < b, :weight, . ), :age );
Une alerte apparaît : « Numéro de ligne non valide »
Votre script fonctionne correctement. Comment pouvons-nous ajouter la partie « par âge » dans Col Maximum dans votre script ?
Re: Filtre de données arrêté dans une boucle forVeuillez consulter la documentation de Col Max - en fait, il peut faire tout le travail nécessaire.
Il suffit d'utiliser une colonne auxiliaire height_bin (par exemple via Transform Column). Pas besoin de filtre de données...

selon ce tableau, il s'agit de James, Barbara, Judy et Marion.
Si vous souhaitez définir les height_bins via un filtre de données, assurez-vous de ne pas manquer les points de jonction, par exemple 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 ) ) )
);