Suggestion de défi de relooking : quelque chose à propos des boucles ou de la recherche d'éléments/valeurs dans une liste/matrice/...Re : Suggestion de défi de relooking : quelque chose à propos des boucles ou de la recherche d'éléments/valeurs dans une liste/matrice/...Salut @jthi ,
J'ai essayé votre première suggestion - et cela fonctionne comme prévu. Merci beaucoup. La dernière ligne est à peu près le one-liner que je recherchais !
Re : Suggestion de défi de relooking : quelque chose à propos des boucles ou de la recherche d'éléments/valeurs dans une liste/matrice/...Idée similaire à celle de Georg. Chaque fois que vous sélectionnez de nouvelles colonnes, exécutez à nouveau la partie EvalEvalExpr()) (peut être transformée en script/complément/raccourci si nécessaire).
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
//create placeholder for colum
new_col = dt << New Column("Sum_selected", Numeric, Continuous);
//after column selection run this part to update script
Eval(EValExpr(new_col << Set Formula(Sum(Expr(Current Data Table() << Get Selected Columns)))));JMP n'a pas (à ma connaissance) de "gestionnaire d'état de colonne", vous ne pouvez donc pas déclencher d'événements après des modifications de sélection de colonne comme vous pouvez le faire avec des lignes.
Vous pouvez également essayer quelque chose comme ceci, mais je vous le déconseille et déplace la mise à jour de la formule en appuyant sur un bouton au lieu du changement de sélection de la zone de colonne de filtre, car il est plus facile à gérer de cette façon.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Semiconductor Capability.jmp");
nw = New Window("Update formula",
window:new_col = dt << New Column("Sum_selected", Numeric, Continuous); //create column inside new window
window:dt = dt;
flc = Filter Col Selector(
dt, << character(0), << nominal(0), << ordinal(0),
<< On Change(
show(window:new_col, window:dt);
window:dt << Select columns((flc << Get Selected));
Eval(EValExpr(window:new_col<< Set Formula(Sum(Expr(window:dt << Get Selected Columns)))));
)
)
);Re : Suggestion de défi de relooking : quelque chose à propos des boucles ou de la recherche d'éléments/valeurs dans une liste/matrice/...Cher @Monomorphiste ,
peut-être que cela aide. Lorsque je travaille avec de nombreuses colonnes, je trouve avantageux de travailler avec des groupes de colonnes. L'exemple ci-dessous définit un groupe (de nombreux exemples peuvent être trouvés dans l'index de script), construit une formule moyenne pour ces colonnes et l'implémente.
La même chose est scriptable pour les colonnes éventuellement sélectionnées, si nécessaire.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Blood Pressure.jmp" );
Wait( 1 );
theGroup = dt << Group Columns( "theGroup", :BP 8M :: :BP 12W );
Wait( 1 );
// build an expression for formula with column replacement
formula_expr = expr(dt << New Column( "Mean_of_Group",
Numeric,
"Continuous",
Format( "Best", 10 ),
Formula( mean( expr(current data table() <<GET column="" group=""></GET>
Re : Suggestion de défi de relooking : quelque chose à propos des boucles ou de la recherche d'éléments/valeurs dans une liste/matrice/...Salut DS,
eh bien, c'est à peu près comme ça que je l'ai fait jusqu'à présent : parcourir les lignes, puis pour chaque ligne, parcourir les colonnes. J'espérais cependant une solution plus élégante. Un simple one-liner....
Voici un exemple précis et très simple :
J'ai 50 colonnes et je souhaite calculer pour chaque ligne la moyenne arithmétique des colonnes que je choisis de sélectionner. Disons que je choisis 3 colonnes E1, E6 et E12 pour calculer la moyenne. Lorsque je fais cela manuellement, cela me prend quelques secondes : Ajoutez une colonne dans le tableau de données, choisissez les 3 colonnes et divisez par 3 -> (:E1 + :E6 + :E12) / 3.
Si je veux faire cela dans un script, et que je veux garder le script valide pour le cas où je choisis non pas 3, mais 4 ou 5 ou 20 colonnes, je n'ai trouvé aucun autre moyen - ni ici dans la communauté ni dans la bibliothèque JMP/les guides de script, etc. - plutôt que de faire une boucle verticale sur chaque ligne, puis d'imbriquer une boucle horizontale dans les colonnes. Cela semble très maladroit ? L'autre option serait d'écrire 49 macros différentes, chacune pour le nombre exact de colonnes sélectionnées, c'est-à-dire que si je veux sélectionner 7 colonnes, j'exécute script7 et si je veux sélectionner 21 colonnes, j'exécute script21, avec la formule ajusté à 21 éléments. Cela je trouve plutôt ridicule (alors je ferais mieux de garder mes boucles imbriquées maladroites....)
N'existe-t-il pas de syntaxe JSL qui condense une formule en une simple ligne comme :
dt << Nouvelle colonne ("AnyTitle", numérique, continue, formule ( Sum_of_all_selected_columns / N_items) ) ?
À quoi ressemblerait la formule d'expression/colonne "Sum_of_all_selected_columns" dans JSL (si elle existe ?!?), lorsque les colonnes sélectionnées sont récupérables à partir d'une ColList ColDialog, est-ce peut-être le :: bit -> Sum(v1::vn) , où v1 est le premier élément de la ColList et vn le dernier, et la formule résume le premier, le dernier et tout le reste, sans qu'il soit nécessaire de spécifier combien d'éléments il y a entre les deux ?
Je rencontre ce problème assez fréquemment, où je souhaite que le script calcule quelque chose (par exemple une somme ou des produits, etc.) avec un nombre d'éléments a priori inconnu.
Acclamations,
Kofi
Re : Suggestion de défi de relooking : quelque chose à propos des boucles ou de la recherche d'éléments/valeurs dans une liste/matrice/...Salut @Monomorphiste ,
Voici un code modifié que j'ai trouvé en cherchant sur les forums de discussion. Le message original est ici .
Je pense que si vous avez une liste de vos colonnes de résultats, qui devrait être assez facile à générer ou à obtenir, alors vous devriez pouvoir implémenter quelque chose comme mes AddCols modifiés pour générer les formules dont vous avez besoin. Le message original était très instructif et intéressant.
Names Default To Here( 1 );
// Make a table
nc = 30;
dt = New Table( "Test" );
For( c = 1, c <= nc, c++,
dt << New Column( "Col" || Char( c ), Numeric, Continuous, Formula( Random Normal() ) )
);
dt << AddRows( 100 );
// Select half the columns
n = Round( nc / 2 );
c = Random Index( N Col( dt ), n );
For( i = 1, i <= n, i++,
Column( dt, c[i] ) << setSelected( 1 )
);
//This part generates the column formulas based on the SelCols list.
SelCols = dt << Get Selected Columns;
For( j = N Items(SelCols), j >= 1, j--,
AddCols = Expr(
dt << New Column( "Sum_" || Char( j ), Formula( Sum( colsTBD ) ) )
);
Substitute Into( AddCols, Expr( colsTBD ), Eval( selCols[1::j] ) );
AddCols;
);
J'espère que cela t'aides!,
DS
Re : Suggestion de défi de relooking : quelque chose à propos des boucles ou de la recherche d'éléments/valeurs dans une liste/matrice/...80 % de mes scripts impliquent des boucles, parcourant des ensembles de données qui comprennent généralement +100 000 lignes et +50 colonnes. En fonction des conditions que j'ai définies, le script peut extraire 2, ou 3 ou 5, ou 10 ou 20 de ces colonnes pour divers calculs (par exemple, des paires log-rapport), dont les résultats sont ensuite stockés dans des "résultats" supplémentaires. " colonnes, peut-être 10, ou 20 ou 100 (que je dois ensuite comparer pour les similitudes...). Si je veux travailler maintenant avec les colonnes de résultats, mais que je ne sais pas avec combien d'entre elles je finirai par me retrouver... comment écrire mes formules pour qu'elles soient toujours valides, que ce soit pour 2 ou pour 200 colonnes à appliquer ?
Je peux transférer chaque colonne de résultats dans une liste afin de savoir combien de colonnes de résultats j'ai. Mais je ne sais toujours pas comment formuler l'équation (comme x = n1 + n2 pour 2 colonnes, mais n1 + n2 + .... + nn pour n colonnes),.
Acclamations,
Kofi