Fonction Map Value : résultats incohérents pour les appels suivantsBonjour,
Je suis nouveau sur JMP 16 et JSL mais je suis un programmeur expérimenté.
Pour certaines raisons, je souhaite utiliser la fonction "Map Value" mais cela me donne des résultats erronés.
Ce que je veux réaliser, c'est supprimer les éléments indésirables donnés sous forme de liste d'une liste contenant des nombres et des chaînes.
La fonction suivante construit une liste pour "Map Value" nommée na_values sous la forme {option1, 0, option2, 0, ...} à partir de la na_list, par exemple {option1, option2,...}
et le filtre à l'aide de la fonction "Filter Each" et "Map Value".
wrap = function({filtered list,na_list}, {Default Local},
na_values={};For Each( {value}, na_list, na_values=Insert(na_values,value);na_values=Insert(na_values,1););
return(Filter Each({value}, filtered list, Map Value(value, na_values, Unmatched(0))==0;));
);Mais cela donne un résultat erroné si j'appelle à nouveau la fonction avec d'autres paramètres :
Show(wrap({"b",1, 2, 3},{"b"})); // <-- returns {1,2,3} => OK
Show(wrap({"d",1, 2, 3},{"d"})); // <-- returns {"d",1,2,3} => NOT OK, should be as above {1,2,3]
Qu'est-ce qui ne va pas ici ? Un bug dans JMP ? J'utilise la version 16.0.0 (512257).
Cordialement,
Thomas
Études de consommation et de marchéExploration et visualisation des donnéesPartager et communiquer les résultatsles fenêtresRe : Fonction Map Value : résultats erronés pour différents caractèresLe support JMP m'a répondu, c'est peut-être un défaut que j'ai constaté.
Leur support m'a donné la solution suivante à mon problème initial pour supprimer les éléments inutiles d'une liste à l'aide de la fonction Associative Array :
filtered list = {"b", 1, 2, 3};
na_list = {"b"};
result = Associative Array(filtered list) << Remove(Associative Array(na_list)) << Get Keys; // {1, 2, 3}Re : Fonction Map Value : résultats erronés pour différents caractèresMerci pour votre réponse. Comme vous l'avez dit, le premier appel fonctionne, les appels suivants échouent.
J'ai appelé notre support JMP à propos de ce problème, qui a confié ce problème à son équipe d'assistance technique. Si j'ai des nouvelles à ce sujet, je les posterai ici.
Re : Fonction Map Value : résultats erronés pour différents caractèresDans votre exemple
Show(wrap({"b",1, 2, 3},{"b"}));
Show(wrap({"d",1, 2, 3},{"d"}));
ne donne pas les bons résultats pour le 2ème appel.
Mais ça marche :
Show(wrap({"d",1, 2, 3},{"d"}));
Ce qui suggère que vous ne devriez pas avoir besoin de lancer des évaluations partout.
Le problème est que le premier appel à la fonction fonctionne et que les appels suivants échouent ; ce qui est très étrange.
Re : Fonction Map Value : résultats erronés pour différents caractèresBonjour, vous avez raison, j'ai supprimé l'initialisation de na_values de ma fonction de test.
Mais le problème existe si j'ajoute l'initialisation de na_values à la fonction :
wrap = function({filtered list,na_list}, {Default Local},
<STRONG>na_values={}</STRONG>;For Each( {value}, na_list, na_values=Insert(na_values,value);na_values=Insert(na_values,1););
return(Filter Each({value}, filtered list, Map Value(value, na_values, Unmatched(0))==0;));
);
Show(wrap({"b",1, 2, 3},{"b"})); // = {1, 2, 3}=> OK
Show(wrap({"d",1, 2, 3},{"d"})); // = {"d", 1, 2, 3} => Not OK ! => expected {1, 2, 3}Veuillez essayer vous-même le code ci-dessus.
Re : Fonction Map Value : résultats erronés pour différents caractèresJe ne sais pas comment vous avez fait fonctionner votre fonction sans d'abord initialiser na_value en tant que liste vide.Cela marche:
names default to here(1);
filtered list = {"d",1, 2, 3};
na_list = {"d"};
na_values = {}; // <--- missing
For Each( {value}, na_list,
na_values=Insert(na_values,value);
na_values=Insert(na_values,1);
);
f = Filter Each({value}, filtered list,
Map Value(value, na_values, Unmatched(0))==0;
);
show(f);Re : Fonction Map Value : résultats erronés pour différents caractèresParfois, JMP / JSL peut être étrange dans la façon dont il gère les expressions - par exemple, souvent, dans une fonction d'envoi, les arguments sont envoyés sans évaluation.Bien qu'il n'y ait pas de fonction d'envoi ici, il semblerait que quelque chose dans le Filtrer chacun() ou Valeur de la carte() gère les arguments d'une manière étrange et gère la recherche de manière étrange.
En gros, je ne peux pas dire que c'est un bug mais ça semble bizarre.Si j'étais vous, je contacterais le support JMP et leur montrerais que le premier appel (qu'il s'agisse du {"b",1,2,3"} ou la {"d",1,2,3} ) fonctionne, tandis que le second ne fonctionne pas.Il est possible que ce soit un bug.
Voici une solution de contournement :
wrap = Function( {filtered list, na_list},
{Default Local},
na_values = {};
For Each( {value}, na_list,
Insert Into( na_values, value );
Insert Into( na_values, 1 );
);
Eval( Eval Expr( Filter Each( {value}, filtered list, Map Value( value, Expr( na_values ), Unmatched( 0 ) ) == 0 ) ) );
);