Le tableau de sous-ensembles continue d'afficher d'anciennes lignes – Comment libérer la mémoire entre les exécutions ?I’m working on a JMP JSL script where I filter tables based on a liste de valeurs fournie par l'utilisateur. I create filtered tables using Subset.
Le problème que je rencontre est le suivant :
-
Au premier lancement , le tableau filtré affiche les lignes correctes.
-
Lors de la deuxième exécution , si je saisis une nouvelle liste, le tableau filtré affiche parfois encore des lignes de l'exécution précédente , ou combine d'anciennes et de nouvelles lignes.
-
I’m using Names Default To Here(1) and Clear Symbols() at the end of the script, but that ne supprime pas complètement la table de la mémoire JMP, so Subset seems to retain references to old rows.
Existe-t-il une méthode recommandée dans JMP pour effacer complètement les références mémoire des tables avant de créer de nouveaux sous-ensembles ?
hows to make Subset filtering reproductible sur plusieurs essais without old data showing up?
Automatisation et scriptageExploration et visualisation des donnéesRe: Le tableau de sous-ensembles continue d'afficher d'anciennes lignes – Comment libérer la mémoire entre les exécutions ?Pouvez-vous fournir un exemple de votre script ? Si vous utilisez correctement la fonction `subset`, les anciennes lignes ne s'afficheront pas.
Re: Le tableau de sous-ensembles continue d'afficher d'anciennes lignes – Comment libérer la mémoire entre les exécutions ?Pourriez-vous partager une version simplifiée de votre code, aussi courte que possible ?
... en commençant par le chargement d'une table de données, par exemple
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Obtenez rapidement des réponses utiles à vos questions
Obtenir rapidement les bonnes réponses aux bonnes questions
Re: Le tableau de sous-ensembles continue d'afficher d'anciennes lignes – Comment libérer la mémoire entre les exécutions ?La plupart de ces problèmes de synchronisation peuvent être résolus via attendre(0).
Il suffit de l'ajouter après la commande subset, et peut-être une autre avant.
Re: Le tableau de sous-ensembles continue d'afficher d'anciennes lignes – Comment libérer la mémoire entre les exécutions ?FilterByValueList = Function({sourceTbl, valueList, outName},
tempTbl = sourceTbl << Duplicate Window();
tempTbl << Clear Row States;
For(i = 1, i <= N Items(valueList), i++,
val = valueList[i];
tempTbl << Row Selection(
Select Where(:Batch Number == val, Current Selection("Extend"))
);
);
resultTbl = tempTbl << Subset(
Selected Rows(1),
Output Table Name(outName),
Invisible
);
Return(resultTbl);
);
// Example usage:
RunDataSubset = FilterByValueList(DataRuns, SelectedValues, "RunDataSubset");
MetaSubset = FilterByValueList(MetaRuns, SelectedValues, "MetaSubset");
//SelectedValues is a list
Re: Le tableau de sous-ensembles continue d'afficher d'anciennes lignes – Comment libérer la mémoire entre les exécutions ?Merci. J'avais oublié de coller le code ; voici un extrait pour référence : lecture des valeurs de la liste d'entrée via une fenêtre, puis :
// Directory path
pathDir = "J:\jmp-data\raw_data";
fileList = Files In Directory(pathDir);
Show(fileList);
selectedValues = {};
For(i = 1, i <= N Items(fileList), i++,
For(j = 1, j <= N Items(targetSource), j++,
If(Contains(fileList[i], targetSource[j]),
Insert Into(selectedValues, targetSource[j]);
Break();
);
);
);
countValues = N Items(selectedValues);
Show(selectedValues);
FilterByValueList = Function({sourceTbl, valueList, outName},
tempTbl = sourceTbl << Duplicate Window();
tempTbl << Clear Row States;
For(i = 1, i <= N Items(valueList), i++,
val = valueList[i];
tempTbl << Row Selection(
Select Where(:Batch Number == val, Current Selection("Extend"))
);
);
resultTbl = tempTbl << Subset(
Selected Rows(1),
Output Table Name(outName),
Invisible
);
Return(resultTbl);
);
// Example usage:
RunDataSubset = FilterByValueList(DataRuns, SelectedValues, "RunDataSubset");
MetaSubset = FilterByValueList(MetaRuns, SelectedValues, "MetaSubset");
J'ai également constaté que la fenêtre créée pour recueillir les données saisies par l'utilisateur contient des variables globales, ce qui pourrait expliquer l'affichage d'anciennes données :
SelectedValuestext = Select_Values_test0 <
<GET text=""></GET>
<BR /> <P><CODE class=" language-jsl"> SelectedValuesText0 = {}; - still has nothing so whenever I run the code again it should take new user input values if they are diff.
</CODE></P>
Re: Le tableau de sous-ensembles continue d'afficher d'anciennes lignes – Comment libérer la mémoire entre les exécutions ?D'où vient la fonction << Duplicate Window() et à quoi sert-elle ?

JSL propose de nombreuses fonctions puissantes qui peuvent remplacer l'utilisation systématique de `for()`. Vous pouvez parcourir les listes plus rapidement grâce à `Filter Each`, `Transform Each` et `for Each`, et effectuer la sélection sans boucle avec `Contains()`.
Re: Le tableau de sous-ensembles continue d'afficher d'anciennes lignes – Comment libérer la mémoire entre les exécutions ?Je me suis rendu compte que la fenêtre dupliquée n'existait pas, j'ai donc procédé à la création du fichier dt comme ceci :
dt = inputTable << Subset(All Rows, All Columns,Output Table("dt"),Invisible);<BR /><BR />
Je ne sais pas s'il existe un moyen plus simple.
L'égalité a = b ne fonctionne pas. Pour les tables de données, je cherchais la fonction copy table(), mais j'ai trouvé copy file().
</CODE></PRE>
<P>Cette méthode de création nécessite également de fermer le tableau à chaque fois. J'ai trouvé cela plus simple à gérer et à mettre en œuvre.</P>
<PRE><CODE class=" language-jsl">
<BR />calcTable = Try( Data Table("KPI"), Empty() );
Re: Le tableau de sous-ensembles continue d'afficher d'anciennes lignes – Comment libérer la mémoire entre les exécutions ?Si vous utilisez correctement la fonction subset, elle n'affichera pas les "anciennes lignes".
Re: Le tableau de sous-ensembles continue d'afficher d'anciennes lignes – Comment libérer la mémoire entre les exécutions ?Je ne comprends pas pourquoi vous créez deux sous-ensembles dans ce cas.
Names Default To Here(1);
path = Convert File Path("$SAMPLE_DATA/", windows);
files = Files In Directory(path);
targetfiles = {"Big Class.jmp", "Probe.jmp"};
files_of_interest = Filter Each({target}, targetfiles,
Contains(files, target);
);
create_filtered_table = function({dt, values, tablename}, {Default Local},
rows_of_interest = dt << Get Rows Where(Contains(values, :Filename));
dt_res = dt << Subset(Rows(rows_of_interest), Selected Columns(0), Output Table(tablename), Invisible);
return(dt_res);
);
dt1 = New Table("table1",
Add Rows(6),
Compress File When Saved(1),
New Column("Filename",
Character,
"Nominal",
Compact(),
Set Values({"Big Class.jmp", "a", "b", "c", "Big Class.jmp"})
)
);
dt2 = New Table("table1",
Add Rows(6),
Compress File When Saved(1),
New Column("Filename",
Character,
"Nominal",
Compact(),
Set Values({"Probe.jmp", "a", "b", "c", "Big Class.jmp"})
)
);
dt_res1 = create_filtered_table(dt1, files_of_interest, "Table1");
dt_res2 = create_filtered_table(dt2, files_of_interest, "Table2");