Map Value-Funktion: Inkonsistente Ergebnisse für nachfolgende AufrufeHallo,
Ich bin neu bei JMP 16 und JSL, aber ich bin ein erfahrener Programmierer.
Aus bestimmten Gründen möchte ich die Funktion „Map Value“ verwenden, aber das führt zu falschen Ergebnissen.
Was ich erreichen möchte, ist, unerwünschte Elemente, die als Liste angegeben sind, aus einer Liste mit Zahlen und Zeichenfolgen zu entfernen
Die folgende Funktion erstellt eine Liste für „Map Value“ mit dem Namen na_values in der Form {option1, 0, option2, 0, ...} aus der na_list, z. B. {option1, option2,...}
und filtert es mit „Filter Each“ und der Funktion „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;));
);Aber es gibt ein falsches Ergebnis, wenn ich die Funktion erneut mit anderen Parametern aufrufe:
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]
Was ist hier falsch? Ein Fehler in JMP? Ich verwende Version 16.0.0 (512257).
Beste grüße,
Thomas
Verbraucher- und MarktforschungDatenexploration und -visualisierungErgebnisse teilen und kommunizierenWindowsBetreff: Map Value-Funktion: Falsche Ergebnisse für verschiedene ZeichenDer JMP-Support hat mir geantwortet, es könnte sich um einen Defekt handeln, den ich gefunden habe.
Ihr Support gab mir die folgende Lösung für mein ursprüngliches Problem, nicht benötigte Elemente aus einer Liste mithilfe der Funktion „Assoziatives Array“ zu entfernen:
filtered list = {"b", 1, 2, 3};
na_list = {"b"};
result = Associative Array(filtered list) << Remove(Associative Array(na_list)) << Get Keys; // {1, 2, 3}Betreff: Map Value-Funktion: Falsche Ergebnisse für verschiedene ZeichenDanke für deine Antwort. Wie Sie gesagt haben, funktioniert der erste Anruf, die nachfolgenden Anrufe schlagen fehl.
Ich habe wegen dieses Problems unseren JMP-Support angerufen, der das Problem an sein technisches Support-Team weitergeleitet hat. Wenn ich dazu Neuigkeiten bekomme, werde ich sie hier posten.
Betreff: Map Value-Funktion: Falsche Ergebnisse für verschiedene ZeichenIn deinem Beispiel
Show(wrap({"b",1, 2, 3},{"b"}));
Show(wrap({"d",1, 2, 3},{"d"}));
liefert beim 2. Aufruf nicht die korrekten Ergebnisse.
Aber das funktioniert:
Show(wrap({"d",1, 2, 3},{"d"}));
Das würde darauf hindeuten, dass Sie nicht überall mit Bewertungen herumwerfen müssen.
Das Problem besteht darin, dass der erste Aufruf der Funktion funktioniert und nachfolgende Aufrufe fehlschlagen. Das ist sehr seltsam.
Betreff: Map Value-Funktion: Falsche Ergebnisse für verschiedene ZeichenHallo, Sie haben Recht, ich habe die Initialisierung von na_values aus meiner Testfunktion entfernt.
Das Problem besteht jedoch, wenn ich der Funktion die Initialisierung von na_values hinzufüge:
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}Bitte probieren Sie den obigen Code selbst aus.
Betreff: Map Value-Funktion: Falsche Ergebnisse für verschiedene ZeichenIch bin mir nicht sicher, wie Sie Ihre Funktion zum Laufen gebracht haben, ohne na_value zunächst als leere Liste zu initialisieren.Das funktioniert:
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);Betreff: Map Value-Funktion: Falsche Ergebnisse für verschiedene ZeichenManchmal kann JMP/JSL seltsam in der Art und Weise sein, wie Ausdrücke verarbeitet werden – zum Beispiel werden die Argumente in einer Sendefunktion oft unausgewertet gesendet.Obwohl es hier keine Sendefunktion gibt, scheint es, dass etwas innerhalb der Alle filtern() oder Kartenwert() behandelt Argumente auf seltsame Weise und geht seltsam mit der Suche um.
Grundsätzlich kann ich nicht sagen, dass es sich um einen Fehler handelt, aber es kommt mir seltsam vor.Wenn ich Sie wäre, würde ich den JMP-Support kontaktieren und ihm zeigen, dass der erste Anruf (sei es der {"b",1,2,3"} oder der {"d",1,2,3} ) funktioniert, während das zweite nicht funktioniert.Möglicherweise handelt es sich um einen Fehler.
Hier ist eine Lösung:
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 ) ) );
);