ComboBox の選択が変更されたときに、DisplayBox のコンテンツを Associate Array で更新しますか?【バージョン:JMP Pro 16.2.0】
こんにちは、
次のようなスクリプトのインターフェイス ウィンドウを構築しようとしています。
- 現在のデータ テーブルを Python に送信し、パラメーターのユーザー入力値を取得します。
- Python でいくつかのアクションを実行します。
- Python DataFrame から現在のデータ テーブルにいくつかの列を追加します。
私が考えているインターフェイスのレイアウトを添付ファイルとして追加しました。
ユーザーに入力を求めるパラメータの内容を更新する方法がまだわかりません。応じて上のコンボボックスでユーザーが選択したオプション。
コードの保守を容易にし、コードの冗長性を避けるために (ComboBox に多くのオプションを用意する予定であるため、私にとって重要です)、パラメータとそのデフォルト値をスクリプト上の連想配列に保存したいと思います。 各オプションのパラメータの数は異なる場合があります。
このアドインのコードを調べてみました ( https://community.jmp.com/t5/JMP-Add-Ins/Data-visualization-with-t-SNE-and-UMAP/ta-p/177969 ) しかし、残念ながら、表示されるフィールドとそれに関連付けられた数値編集ボックスの値はハードコーディングされています。
ご協力いただきありがとうございます。
よろしくお願いします、
フランソワ
#エマニュエル・ロムー
#ジェームズ・バーク
AA =
Associative Array(
{
{"Choice_A",
[
"param_1" => 2,
"param 2" => 15,
"param_4" => .
]
},
{"Choice_B",
[
"param 1" => 2,
"param 3" => 10,
"param 4" => .
]
},
{"Choice_C",
[
"param 1" => 3,
"param 4" => .,
"param 6" => 23,
"param 7" => 123
]
}
}
);

データアクセスRe: ComboBox の選択が変更されたときに、DisplayBox のコンテンツを Associate Array で更新しますか?これらすべてが他の投稿で回答されているかどうかはまだ追跡していませんが、次の 2 つの考えがあります。
- パラメーターの順序を維持したい場合は、次のように連想配列内で配列を使用できます。
AA = Associative Array( {
{"Choice_A", [
//Array of here to maintain order<BR /> ["name" => "param_1", "default" => 2],
["name" => "param_2", "default" => 15],
["name" => "param_3", "default" => .],
]}
} )
- テキスト ボックスと数値編集ボックスの幅を指定してすべてを揃えることも、代わりにテーブルを使用することもできます。番号列編集ボックス。
Re: ComboBox の選択が変更されたときに、DisplayBox のコンテンツを Associate Array で更新しますか?関連領域には順序がありません。 強制することはできません。 JMP は、<< Get Keys などのメッセージで内容を調べるときの便宜のためにのみ結果を並べ替えます。
Names Default to Here( 1 );
// load an associative array in order of C, B, A
aa = Associative Array();
aa["Choice_C"] = ["param 1" => 3, "param 4" => ., "param 6" => 23, "param 7" => 123];
aa["Choice_B"] = ["param 1" => 2, "param 3" => 10, "param 4" => .];
aa["Choice_A"] = ["param_1" => 2, "param 2" => 15, "param_4" => .];
// examine associative array as a whole (JMP orders output, not content, alphanumerically)
Show(
aa << Get Keys,
aa << Get Values,
aa
);
// examine associative array one entry at a time
i = aa << First;
While( Not( Is Empty( i ) ),
Show( aa[i] );
i = aa << Next( i );
);
Re: ComboBox の選択が変更されたときに、DisplayBox のコンテンツを Associate Array で更新しますか?以下のように、ダイアログをモーダルにすることができます。
リコール関数を作成するには、ウィンドウを表示するために使用されるコードから分離できるコードの別の部分で AA を初期化することにより、ウィンドウが開くたびに AA が再初期化されないようにする必要があります。
[OK] ボタンを押すたびに、既に行われているように新しい値を適切な AA に保存するだけでなく、設定をグローバル (または、できればスコープ付き) 変数に保存し、これらの変数の値を使用して次回「リコール」を押したときにダイアログが表示されます。
Names Default To Here( 1 );
AAopt1 = Associative Array( Words( "p1,p2,p3", "," ), {1, 2, 3} );
AAopt2 = Associative Array( Words( "p1,p4", "," ), {1, 10} );
AAopt3 = Associative Array( Words( "p2,p5,p6,p7", "," ), {2, 6, 12, 20} );
MainAA = Associative Array( Words( "option1,option2,option3", "," ), Eval List( {AAopt1, AAopt2, AAopt3} ) );
nw = New Window( "xx", <<MODAL></MODAL>Re: ComboBox の選択が変更されたときに、DisplayBox のコンテンツを Associate Array で更新しますか?こんにちは、ブレイディさん
迅速なお返事をありがとう。
私はあなたのスクリプトを詳しく調べて実験し、いくつかの更新を加えました。
差し支えなければ、まだいくつか質問/コメントがあります。
- メインの AA を複数の AA に分割し、各オプションに 1 つずつ追加しても問題ありません
- ウィンドウがモーダルになるようにスクリプトを調整できますか?
ウィンドウインターフェイスをフリーズし、ユーザーが「OK」をクリックしたらすぐに閉じたいと考えています。 - 機能する「呼び出し」ボタン ボックスをこのインターフェイスに簡単に追加できますか?
- 最後に、私がやろうとしていることを説明するために、更新されたスクリプトにコメントを追加しました。
ご協力いただきありがとうございます。
乾杯、
フランソワ
Re: ComboBox の選択が変更されたときに、DisplayBox のコンテンツを Associate Array で更新しますか?やあ@ih 、
迅速なお返事をありがとう。
ウィンドウ変数を使用したスクリプトを詳しく調べました。
私はそれで遊んで、いくつかのアップデートを加えました。
差し支えなければ、まだいくつか質問/コメントがあります。
- 私にとっての問題の 1 つは、入力するパラメータの順序が、連想配列にパラメータを配置した順序に従っていないことです。
AAの定義と同じ順序にしたいと思います。 それは可能ですか? - カップル (TextBox、Number Edit Box) のレイアウトを改善して、2 つの別々の列に配置できるようにすることはできますか (説明のためにスクリーンショットを追加します - LineUp Box を使用して行います)。
また、V リスト ボックス (window:vlbParam) をテーブル ボックスに置き換えようとしましたが、今のところ成功していません。 - 機能する「呼び出し」ボタン ボックスをこのインターフェイスに簡単に追加できますか?
- 最後に、私がやろうとしていることを説明するために、更新されたスクリプトにコメントを追加しました。
再度、感謝します !
よろしく、
フランソワ
Re: ComboBox の選択が変更されたときに、DisplayBox のコンテンツを Associate Array で更新しますか?やあ、
これを行うための比較的効率的な方法の 1 つは次のとおりです。
1) パラメータ/値セットを AA で定義します (オプションごとに 1 つの AA)。
2) これらの AA を「メイン」AA に配置します。
3) コンボボックスを使用して「メイン」AA 内を選択します
4) 任意の選択に対して、(現在のテーブルボックスが存在する場合は削除した後) 単一のテーブルボックスを表示します。その行は、関連するオプション AA のエントリに対応します。
5) 「実行」ボタンを押すと、これまでに行われた入力内容で関連する「オプション」AA を簡単に更新して続行できます。 ここでは、mainAA がログに書き込まれるため、押すたびにその内容を確認できます。
乾杯、
ブレイディ
Names Default To Here( 1 );
AAopt1 = Associative Array( Words( "p1,p2,p3", "," ), {1, 2, 3} );
AAopt2 = Associative Array( Words( "p1,p4", "," ), {1, 10} );
AAopt3 = Associative Array( Words( "p2,p5,p6,p7", "," ), {2, 6, 12, 20} );
MainAA = Associative Array( Words( "option1,option2,option3", "," ), Eval List( {AAopt1, AAopt2, AAopt3} ) );
nw = New Window( "xx",
V List Box(
cb = Combo Box(
mainAA << get keys,
Try( TB << delete );
tableVLB << append(
tb = Table Box(
TbSCB = String Col Box( "parameter", mainAA[cb << get selected] << Get Keys ),
TbNCEB = Number Col Edit Box( "value", mainAA[cb << get selected] << Get Values )
)
);
),
tableVLB = V List Box(),
bb = Button Box( "Go",
mainAA[cb << get selected] = Associative Array( TbSCB << get, TbNCEB << get );
Show( mainAA );
)
)
);
eval(cb << get function);

Re: ComboBox の選択が変更されたときに、DisplayBox のコンテンツを Associate Array で更新しますか?やあ@fch_jmp 、
あなたの質問を正しく理解できれば、これはあなたが探しているものであると思います:
Names default to here(1);
AA = Associative Array( {
{"Choice_A", ["param_1" => 2, "param 2" => 15, "param_4" => .]},
{"Choice_B", ["param 1" => 2, "param 3" => 10, "param 4" => .]},
{"Choice_C", ["param 1" => 3, "param 4" => ., "param 6" => 23, "param 7" => 123]}
} );
//return a label and
parambox = function({name,val},
h list box(
text box(name),
nebParam[name] = number edit box(val)
)
);
updateparams = function({},
while( !is empty( vlbParams << child ), (vlbParams << child) << delete );
nebParam = Associative Array();
for each({{param, value}, i}, AA[cb << GetSelected()],
vlbParams << append(
parambox(param, value)
);
)
);
win = new window("cb test",
cb = Combo Box(
AA << Get Keys,
updateparams();
),
vlbParams = v list box(),
button box("Write to the log",
for each({{param, value}}, nebParam, print(param || ": " || char(value << get)));
)
);
cb << set(1);
updateparams();
この方法では複数のウィンドウが互いに衝突する可能性があるため、実際にはウィンドウ変数を使用することに注意してください。 これを 1 回実行し、パラメータ配列を変更してから再度実行し、両方のウィンドウが独立して動作する様子を確認してください。
もっと見る...