這一點與此相關的問題如何定義操縱控制變量定義的一部分,以減少代碼的重複
Define control as variable in Mathematica
但上面的問題沒有回答我的問題,因爲它談論的全控制定義。 (我也嘗試了一些在那裏顯示的技巧,但他們不適合我的問題)。
我現在問的只是部分控件的定義。 (使用這種論壇格式跟進一個老問題也很困難,因爲使用微小的評論區域時,很難提問和展示更多問題,比如在問一個空間較大的新問題時,可以粘貼代碼和圖片)。
我所做的所有嘗試都不起作用。我將以簡單的例子來解釋問題。
假設一個想寫
Clear["Global`*"];
Manipulate[Plot[f*g, {x, -1, 1}],
Grid[{
{Style["f(x)="],
PopupMenu[Dynamic[f], {x, x^2, x^3}, ImageSize -> Tiny]},{Style["g(x)="],
PopupMenu[Dynamic[g], {x, x^2, x^3}, ImageSize -> Tiny]}
}]
]
,你可以看到有配發在每個控制定義代碼重複的。 (之類的東西IMAGESIZE,Spacings->等衆多裝飾設置,重複一遍又一遍地爲每個控制。
什麼將是巨大的,如果我能寫類似
Manipulate[Plot[f*g, {x, -1, 1}],
Grid[{
{Style["f(x)="], PopupMenu[Dynamic[f], [email protected]@v]},
{Style["g(x)="], PopupMenu[Dynamic[g], [email protected]@v]}
}],
Initialization :>
(
v = {{x, x^2, x^3}, ImageSize -> Tiny}
)
]
但是,這是行不通的。我會嘗試很多其他的事情沿上述路線,並沒有什麼作品。像
{Style["f(x)="], PopupMenu[Dynamic[f], v]},
和
{Style["f(x)="], PopupMenu[Dynamic[f], [email protected]]}
和
Manipulate[Plot[f*g, {x, -1, 1}],
{{v, {{x, x^2, x^3}, ImageSize -> Tiny}}, None},
Grid[{
{Style["f(x)="], PopupMenu[Dynamic[f], [email protected]]},
{Style["g(x)="], PopupMenu[Dynamic[g], v]}
}]
]
無法得到它的工作。
但是,下面是遊戲規則:這將用於演示,因此,代碼必須以Manipulate開頭。模塊不能在外部操作。另外,不能使用Hold及其朋友。但可以使用未評估。
我希望這裏的專家可能有一個技巧來做到這一點。如果可以做到這一點,將減少代碼的大小,因爲我有許多控件,它包含許多像上面這些相同的「選項」,並且能夠執行上述操作將使代碼更易於閱讀和管理。
謝謝,
ps。我所要求的,有點類似於人們對繪圖選項所做的描述,其中人們可以使用SetOptions來設置一些常用的默認選項,以便每次不必爲每個繪圖命令重複它們。但在這種情況下沒有這樣的事情。
更新
使用下面列昂尼德所示的方法,(宏把戲),我想用它來幫助我確定的控制數,都使用一個常用的設置。這是我嘗試過的:
Manipulate[{x, y},
[email protected][
{
control1 = Function[{var, initialValue, str, from, to, incr},
{
{{var, initialValue, str}, from, to, incr, ImageSize -> Tiny}
}
,
HoldAll
]
},
{
[email protected][x, 0, "x=", 0, 1, .1],
[email protected][y, 0, "y=", 0, 2, .1],
[email protected][z, 0, "z=", 0, 10, .1]
},
]
]
這個問題只是一個額外的問題,否則它會起作用。將繼續努力解決這個問題。但接近。嘗試序列[]和平鋪[..,1]等,但還不能做到這一點。多喝咖啡,應該有所幫助。
更新2
這是利用以下方法西蒙使用,以幫助在一個以上的控制限定共同定義一個例子。這樣,人們可以使用它來減少代碼重複,以便在一組單獨的控件上使用通用選項。
注意,必須使用Control[]
來控制它。
Manipulate[{x, y, z},
Dynamic[Grid[{
{control1[x, 0, "x=", 0, 1, .1]},
{control1[y, 0, "y=", 0, 2, .1]},
{control1[z, 0, "z=", 0, 10, .1]}
}]],
{{control1,
Function[{var, initialValue, str, from, to, incr},
Control[{{var, initialValue, str}, from, to, incr,
ImageSize -> Tiny}], HoldFirst]}, None}
]
更新3
,並得到獅子座的方法也工作在一個以上的控制。訣竅是使用Control[]
。不能使用普通的老版本{{x,0,"x"},...}
[編輯,是的,你可以,只需要如下列Leonid更新所示的Sequence @@方法。]。
這就是:
Manipulate[{x, y, z},
[email protected][
{
control1 = Function[{var, initialValue, str, from, to, incr},
Control[{{var, initialValue, str}, from, to, incr,
ImageSize -> Tiny}]
, HoldAll
]
},
Grid[{
{control1[x, 0, "x=", 0, 1, .1]},
{control1[y, 0, "y=", 0, 2, .1]},
{control1[z, 0, "z=", 0, 10, .1]}
}]
]
]
我會嘗試(擁有超過600線的只是控制佈局代碼,到目前爲止,這些方法之一融入我的主要演示和成長一分鐘,希望這些方法會縮小這個相當多)
更新9/26/11。下午7點
我以爲我發佈了'鳥眼'的代碼保存視圖,通過使用'宏'來定義控件,其中包含許多常見的鍋爐代碼。這是前後的屏幕截圖。
再次感謝所有的答案和幫助。
由於所有的答案(列昂尼德,西蒙,WReach)。所有偉大的答案。我選擇使用Leonid的宏觀方法只是因爲它沒有使用Dynamics,而我對Dynamics沒有太大的好處,並且似乎對它們有麻煩:)。儘管兩種方法都運行良好,但所有事情都是平等的,我更喜歡一種不使用動態的方法,只是個人的偏好,還有我缺乏動態的經驗。我發佈了一個更新,上面顯示了我獲得的代碼縮減,因爲我開始整合這種新的佈局控件的方式,並將代碼保存爲令人驚歎的演示。 – Nasser
不幸的是,在許多情況下,在Mathematica中很難獲得這樣的代碼縮減,因爲它很難控制評估/寫入宏。我認爲,更好的方法來做到這一點在mma中尚未被發現(我對這個話題特別感興趣)。 –
從看你的屏幕截圖我注意到你遺漏了純函數(宏)的'HoldAll'屬性。雖然這在大多數情況下都能正常工作,但在Manipulate中使用的變量的預定義值可能會導致麻煩(我不知道這是否可以在演示的背景下實際發生)。通過添加屬性,你將保護你的代碼免受這種情況的影響(這是一個將函數轉換爲宏的屬性,就其語義而言) –