Funzione mappa valore: risultati incoerenti per le chiamate successiveCiao,
Sono nuovo di JMP 16 e JSL ma sono un programmatore esperto.
Per alcuni motivi voglio utilizzare la funzione "Map Value" ma questo mi dà risultati sbagliati.
Quello che voglio ottenere è rimuovere gli elementi indesiderati forniti come elenco da un elenco contenente numeri e stringhe
La funzione seguente crea un elenco per "Map Value" denominato na_values nella forma {option1, 0, option2, 0, ...} da na_list, ad esempio {option1, option2 ,...}
e lo filtra utilizzando la funzione "Filtra ogni" e la funzione Mappa valore".
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;));
);Ma dà un risultato sbagliato se chiamo di nuovo la funzione con altri parametri:
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]
Cosa c'è di sbagliato qui? Un bug in JMP? Sto usando la versione 16.0.0 (512257).
Distinti saluti,
Tommaso
ScriptingfinestreRi: Funzione valore mappa: risultati errati per caratteri diversiIl supporto JMP mi ha risposto, potrebbe essere un difetto che ho riscontrato.
Il loro supporto mi ha fornito la seguente soluzione al mio problema originale per rimuovere gli elementi non necessari da un elenco utilizzando la funzione 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}Ri: Funzione valore mappa: risultati errati per caratteri diversiGrazie per la tua risposta. Come hai detto la prima chiamata funziona, le chiamate successive falliscono.
Ho chiamato il nostro supporto JMP per questo problema che ha sottoposto il problema al suo team di supporto tecnico. Se avrò notizie in merito le pubblicherò qui.
Ri: Funzione valore mappa: risultati errati per caratteri diversiNel tuo esempio
Show(wrap({"b",1, 2, 3},{"b"}));
Show(wrap({"d",1, 2, 3},{"d"}));
non dà i risultati corretti per la seconda chiamata.
Ma questo funziona:
Show(wrap({"d",1, 2, 3},{"d"}));
Il che suggerirebbe che non dovresti aver bisogno di lanciare valutazioni dappertutto.
Il problema è che la prima chiamata alla funzione funziona e le chiamate successive falliscono; il che è molto strano.
Ri: Funzione valore mappa: risultati errati per caratteri diversiCiao, hai ragione, ho rimosso l'inizializzazione di na_values dalla mia funzione di test.
Ma il problema esiste se aggiungo l'inizializzazione di na_values alla funzione:
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}Prova tu stesso il codice sopra.
Ri: Funzione valore mappa: risultati errati per caratteri diversiNon sono sicuro di come hai fatto funzionare la tua funzione senza prima inizializzare na_value come una lista vuota.Funziona:
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);Ri: Funzione valore mappa: risultati errati per caratteri diversiA volte JMP/JSL può essere strano nel modo in cui gestisce le espressioni, ad esempio, spesso in una funzione di invio gli argomenti vengono inviati senza valutazione.Sebbene qui non ci sia alcuna funzione di invio, sembrerebbe che qualcosa all'interno del file Filtra ciascuno() O Valore mappa() gestisce gli argomenti in modo strano e gestisce la ricerca in modo strano.
Fondamentalmente, non posso dire che sia un bug ma sembra strano.Se fossi in te contatterei l'assistenza JMP e mostrerei loro che la prima chiamata (che sia il {"b",1,2,3"} o il {"d",1,2,3} ) funziona, mentre il secondo non funziona.Possibile che sia un bug.
Ecco una soluzione:
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 ) ) );
);