當組合框的選擇發生變化時,用關聯數組更新顯示框的內容?[版本:JMP Pro 16.2.0]
你好,
我正在嘗試為腳本構建一個界面窗口:
- 將當前數據表發送到Python並獲取用戶輸入的參數值,
- 在Python中執行一些操作,
- 將 Python DataFrame 中的一些列添加到當前數據表中。
我添加了我想要的界面佈局作為附件。
我還沒想好如何更新提示用戶輸入的參數內容根據用戶在上面的組合框中選擇的選項。
為了使代碼更易於維護並避免代碼冗餘(對我來說很重要,因為我計劃在組合框中有很多選項),我想將參數及其默認值存儲在腳本頂部的關聯數組中。 每個選項的參數數量可能不同。
我查看了這個插件的代碼( 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
]
}
}
);

數據存取回复:當組合框的選擇發生變化時,用關聯數組更新顯示框的內容?我還沒有跟踪所有這些是否在其他帖子中得到了回答,但有兩個想法:
- 如果你想保持參數有序,你可以在關聯數組中使用數組,如下所示:
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" => .],
]}
} )
- 您可以指定文本框和數字編輯框的寬度以使所有內容對齊,或者您可以使用帶有編號編輯框。
回复:當組合框的選擇發生變化時,用關聯數組更新顯示框的內容?關聯區域沒有順序。 你不能強加一個。 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 );
);
回复:當組合框的選擇發生變化時,用關聯數組更新顯示框的內容?您可以使對話框成為模式對話框,如下所示。
要創建召回功能,您需要通過在代碼的另一部分中初始化 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>回复:當組合框的選擇發生變化時,用關聯數組更新顯示框的內容?嗨布雷迪,
感謝你的及時回复。
我仔細查看了您的腳本,進行了試驗並對其進行了一些更新。
如果您不介意的話,我還有幾個問題/意見:
- 將主 AA 分成幾個 AA,每個選項一個對我來說就可以了
- 您的腳本可以修改以使窗口成為模態窗口嗎?
我更願意凍結窗口界面並在用戶單擊“確定”後立即關閉它。 - 可以將有效的“召回”按鈕框輕鬆添加到此界面嗎?
- 最後,我在您更新的腳本中添加了一些評論,以解釋我想要做什麼。
再次感謝你的幫助。
乾杯,
弗朗索瓦
回复:當組合框的選擇發生變化時,用關聯數組更新顯示框的內容?你好@ih ,
感謝你的及時回复。
我仔細查看了您的帶有窗口變量的腳本。
我玩過它並對其進行了一些更新。
如果您不介意的話,我還有幾個問題/意見:
- 對我來說,一個問題是要輸入的參數的順序與我將它們放入關聯數組中的順序不同。
我希望它們的順序與 AA 定義中的順序相同。 那可能嗎 ? - 可以改進對的佈局(文本框、數字編輯框),使它們在兩個單獨的列中對齊(我添加屏幕截圖來說明 - 使用 LineUp Box 完成 - )
我還嘗試用表格框替換 V 列錶框(窗口:vlbParam),但到目前為止沒有成功。 - 可以將有效的“召回”按鈕框輕鬆添加到此界面嗎?
- 最後,我在您更新的腳本中添加了一些評論,以解釋我想要做什麼。
再次感謝 !
問候,
弗朗索瓦
回复:當組合框的選擇發生變化時,用關聯數組更新顯示框的內容?你好,
一種相對有效的方法如下。
1) 在 AA 中定義參數/值集,每個選項一個 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);

回复:當組合框的選擇發生變化時,用關聯數組更新顯示框的內容?你好@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();
請注意,使用此方法多個窗口可能會相互碰撞,因此我實際上會使用窗口變量。 嘗試運行一次,更改參數數組,然後再次運行它並註意兩個窗口如何獨立工作。
查看更多...