マップ値関数: 後続の呼び出しの一貫性のない結果こんにちは、
JMP 16 と JSL は初めてですが、経験豊富なプログラマーです。
何らかの理由で「マップ値」機能を使用したいのですが、これは間違った結果をもたらします。
私が達成したいのは、数字と文字列を含むリストからリストとして指定された不要なアイテムを削除することです
次の関数は、na_list から {option1, 0, option2, 0, ...} の形式で na_values という名前の「マップ値」のリストを作成します (例: {option1, option2 ,...})
「Filter Each」と「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;));
);しかし、他のパラメーターを指定して関数を再度呼び出すと、間違った結果が得られます。
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]
ここで何が問題なのですか? JMPのバグ? バージョン 16.0.0 (512257) を使用しています。
よろしくお願いします、
トーマス
スクリプティングウィンドウズRe: マップ値関数: 異なる文字の間違った結果JMP サポートから回答がありました。これは、私が見つけた欠陥である可能性があります。
彼らのサポートにより、連想配列関数を使用してリストから不要なアイテムを削除するという最初の問題に対する次の解決策が得られました。
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: マップ値関数: 異なる文字の間違った結果お返事をありがとうございます。 あなたが言ったように、最初の呼び出しは機能しますが、その後の呼び出しは失敗します。
この問題について JMP サポートに電話したところ、テクニカル サポート チームにこの問題が報告されました。 何かニュースがあれば、ここに投稿します。
Re: マップ値関数: 異なる文字の間違った結果あなたの例では
Show(wrap({"b",1, 2, 3},{"b"}));
Show(wrap({"d",1, 2, 3},{"d"}));
2回目の呼び出しで正しい結果が得られません。
しかし、これは機能します:
Show(wrap({"d",1, 2, 3},{"d"}));
これは、評価をあちこちに投げる必要がないことを示唆しています。
問題は、関数への最初の呼び出しが機能し、その後の呼び出しが失敗することです。これは非常に奇妙です。
Re: マップ値関数: 異なる文字の間違った結果こんにちは、その通りです。テスト関数から na_values の初期化を削除しました。
しかし、na_values の初期化を関数に追加すると問題が発生します。
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}上記のコードを自分で試してみてください。
Re: マップ値関数: 異なる文字の間違った結果最初に na_value を空のリストとして初期化せずに関数を機能させる方法がわかりません。これは機能します:
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: マップ値関数: 異なる文字の間違った結果JMP / JSL は、式の処理方法がおかしい場合があります。たとえば、send 関数では、引数が評価されずに送信されることがよくあります。ここには送信機能はありませんが、各フィルター()またマップ値()奇妙な方法で引数を処理し、奇妙な方法で検索を処理します。
基本的にバグとは言えませんが、変な感じです。もし私があなたなら、JMP サポートに連絡して、最初の電話であることを示します (それが{"b",1,2,3"}または{"d",1,2,3} ) は機能しますが、2 番目は機能しません。バグの可能性あり。
回避策は次のとおりです。
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 ) ) );
);