Existe-t-il un moyen d'appeler une fonction utilisateur avec différents filtres de ligneDésolé. Je ne sais pas comment le décrire au mieux dans le titre mais je vais essayer d'illustrer ce que j'ai actuellement et ce que je voulais réaliser:
Ce que j'ai:
J'ai donc cette fonction qui calcule pour Col Min, Max et Mean
col_stats = Function( { COL_NAME }, {},
curr_dt = Cuurent Data Table();
min_val = Col Min ( curr_dt:Eval(COL_NAME));
max_val = Col Max ( curr_dt:Eval(COL_NAME));
mean_val = Col Mean ( curr_dt:Eval(COL_NAME));
Eval List({min_val, max_val, mean_val});
);Ce que je veux réaliser:
Je veux pouvoir appeler la fonction col_stat, filtrer les données en utilisant la combinaison d'une ou plusieurs listes.
Le nombre de listes peut changer en fonction de l'utilisateur, pour l'exemple ci-dessous, l'utilisateur sélectionne temp et vcc (l'utilisateur peut ajouter une fréquence, etc.)
temperature = {-40, 0, 25, 100};<BR />vcc = {1.2, 1.26, 1.32};Je veux pouvoir obtenir la moyenne minimale en utilisant la fonction col_stat pour
-40 et 1,20 V
-40 et 1,26 V
etc.
Si le nombre de listes est connu, je sais que je peux faire une boucle double pour itérer à travers la combinaison de deux listes mais je veux l'étendre de telle sorte que l'utilisateur puisse ajouter plus de liste
J'espère que je l'ai bien expliqué.
ScriptingRe: Existe-t-il un moyen d'appeler une fonction utilisateur avec différents filtres de ligneMa réflexion à ce sujet est que vous devez apporter une modification assez simple à votre fonction pour qu'elle ne fonctionne que sur les lignes sélectionnées dans votre tableau de données. Le Show () avec l'appel à votre fonction suppose que la table de données Big Class est ouverte.
col_stats = Function( {dt, COL_NAME},
{defaultlocal},
min_val = Col Min( If( Selected( Row State( Row() ) ), column(dt, COL_NAME ), . ) );
max_val = Col Max( If( Selected( Row State( Row() ) ), column(dt, COL_NAME ), . ) );
mean_val = Col Mean( If( Selected( Row State( Row() ) ), column(dt, COL_NAME ), . ) );
Return( Eval List( {min_val, max_val, mean_val} ) );
);
show(col_stats(dt,"height"));
En effectuant vos calculs uniquement sur les lignes sélectionnées, vous pouvez utiliser la fonctionnalité de
dt << Sélectionnez où ()
pour définir toutes les combinaisons d'éléments que vous souhaitez, puis pour appeler la fonction et obtenir les résultats.
Et, vous n'avez pas à tout forcer en un seul emplacement sélectionné. Si vous regardez la définition de Select Where, vous verrez que vous pouvez construire dynamiquement votre sélection globale finale en passant plusieurs clauses Select Where (), et en spécifiant si vous souhaitez étendre le contrat à partir de la sélection actuelle. Si toutes les lignes avec -40 sont actuellement sélectionnées, vous pouvez dire à JMP d'ajouter la qualification supplémentaire de "uniquement le vcc de 1,20).
Re: Existe-t-il un moyen d'appeler une fonction utilisateur avec différents filtres de ligneUtilisez une boucle imbriquée pour: {{temperature}, {vccs}}?
Re: Existe-t-il un moyen d'appeler une fonction utilisateur avec différents filtres de ligne
Si vous utilisez une clause Where, vous trouverez peut-être un peu plus rapide de simplement obtenir les valeurs des lignes d'intérêt et d'utiliser les méthodes de la matrice:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
col_stats = Function( {dt, rows, COL_NAME},
{defaultlocal},
vals = column(dt, COL_NAME )[rows];
min_val = Min( vals );
max_val = Max( vals );
mean_val = Mean( vals );
Return( Eval List( {min_val, max_val, mean_val} ) );
);
show(col_stats(dt, dt<<GET rows="" where=""></GET>
Cela échange un peu de mémoire pour la vitesse - Vous avez deux vecteurs supplémentaires, mais cela ne nécessite pas de boucle ou de conditions dans l'évaluation JSL.
Re: Existe-t-il un moyen d'appeler une fonction utilisateur avec différents filtres de ligneFaire une boucle imbriquée nécessiterait de coder en dur deux boucles for pour les deux listes, non?
Je voudrais éviter cela, parce que si l'utilisateur ajoute plus de liste de filtres comme freq = {10, 20, 30}, cela ne fonctionnera pas, non?
Je voudrais que cela fonctionne un peu comme le "By" dans Distribution si j'ajoute temp, wafer, vcc dans la liste "By" cela générerait la distribution de toutes les combinaisons de temp, wafer & vcc. Mais j'aime que cela fonctionne avec ma propre fonction.