2010-06-04 37 views
3

的名單上有一大組參數P的內搭幾個不同的值集合V-I,並想用ActionMenu[],使分配P = V-I容易,就像這樣:如何構建集的

ActionMenu["Label", {"name_1" :> (P = V_1;),..}] 

現在問題在於V_i的集合很大並且不是靜態的,所以我不想用手來反覆編寫長列表{"opt_1" :> (P = V_1;),..},而是想要生成它。

我完全沉迷於如何做到這一點。一般的處理方法是一樣的東西

[email protected][listOfNames,listOfActions] 

其中listOfActions應該像

[email protected][repeatedListOfP,listOfV_i] 

但是,這是行不通的。由於Set[]是一個非常特殊的功能,我的其他常用方法都不起作用(構建Table[],替換標頭等)。你如何構建一個Set[]操作列表?

+0

你能提煉出這個ActionMenu部分,如果是這樣的這個問題不是根本問題? – dreeves 2010-06-04 22:32:57

+0

是的,與此同時,我已經通過使用SetterBar和Dynamic來解決這個問題,無論如何,這在美學上更加令人愉悅。儘管如此,仍然有興趣獲得Set []操作的列表。 – Timo 2010-06-05 04:50:50

回答

2

您的問題可能還有更多,我還沒有得到好評,但也許這會讓您走上正軌。

MapThread[Hold[#1 = #2]&, {{a, b, c}, {1, 2, 3}}] 

返回,像這樣未評估的 「設置」 列表S:

{Hold[a = 1], Hold[b = 2], Hold[c = 3]} 

如果你調用ReleaseHold以上,則分配將實際發生。

更多關於保留和親戚在這裏:
Mathematica: Unevaluated vs Defer vs Hold vs HoldForm vs HoldAllComplete vs etc etc

+0

你用「......然後作業實際上會發生」擊中頭部。我需要Mathematica給我一個'{(a = 1);,(b = 2);,...}'的文字列表,而不需要評估,也沒有留下任何Hold []結構。 – Timo 2010-06-05 04:44:37

+0

是! Defer []能做到這一點。 – Timo 2010-06-05 04:48:20

1

這裏的時候我一直想有一個有副作用RuleDelayed應用程序,我使用的替代解決方案。您使用不同的頭替換爲Set,直到您在RuleDelayed表單的右側(其中RuleDelayedHoldRest屬性將保留該表單)的表達式的右側,然後再替換Set。當我這樣做時,我喜歡用Module爲我創建一個獨特的符號。這樣,您不必使用Defer,這是一個比Unevaluated更令人不快的結構。

下面是一個例子:

Module[{set}, 
Attributes[set] = Attributes[Set]; 

With[{rhs = MapThread[set, Unevaluated[{{x, y, z}, {1, 2, 3}}]]}, 
    "name1" :> rhs /. {set -> Set, List -> CompoundExpression}]] 

的原因set的符號被給予相同的屬性Set,而Unevaluated是有其原因,是要確保這個工程即使有人已經分配一個值到x,yz

另一種可能性是包裝你所有Set表達了爲關閉,然後用Scan打電話給他們時,RuleDelayed進行評估,就像這樣:

With[{thunks = MapThread[Function[{a, b}, (a = b) &, HoldAll], 
    Unevaluated[{{x, y, z}, {1, 2, 3}}]]}, 
"name1" :> Scan[#[] &, thunks]] 
相關問題