2011-08-21 19 views
7

定義控制可變當我使用操縱我可以這樣做:在數學

Manipulate[x, {u, 1, 10}] 

在現實中我控制多而複雜,所以我寧願把他們 定義了操縱的表情,像:

control = {u, 1, 10} 
Manipulate[x, control] 

但這導致一個錯誤:

Manipulate argument control does not have the correct form for a \ 
variable specification. 

爲什麼它不這樣工作?

+1

您提供的例子,我在大多數的答案看到的是代碼的複雜性根本沒有減少。一些答案創建了一個非常複雜的代碼片段,它使用了更多的字符,一堆額外的範圍構造等等。我覺得只需改進代碼的_layout_(每個控件在它自己的行上,可視化地分組相關的控件等)大多數情況下足夠。 –

+0

通過我的回答,我更好地理解發生了什麼,但你完全正確:沒有任何構造使代碼變得更簡單。讓我瘋狂的是我的代碼中瘋狂的括號嵌套深度。這可能就是Lisp的做法,但是沒有辦法讓我的程序更線性化嗎? –

+1

@Sjoerd,如果一段代碼出現在一個地方,那麼我大多同意你的看法。如果a)您在多個地方使用代碼,或者b)整個代碼變得太長以至於無法輕鬆修改,那麼執行此操作通常是有意義的。例如,我有一臺筆記本電腦,其中的「Manipulate」代碼不在我的MacBook的13英寸屏幕上。我必須使用這樣的技巧,或者每次需要修改時都嘗試將全部內容加載到我的頭上。由於我已經必須認真思考我實際解決的問題,所以我寧願通過添加幾個字符來降低代碼的複雜性。 – acl

回答

10

con = {u, 1, 10}; 
Manipulate[ 
u, 
[email protected] 
] 

確實工作。我想這不無Evaluate因爲

Attributes[Manipulate] 

表明Manipulate具有屬性HoldAll(但我可能是錯的)工作。要查看此屬性的效果,試試這個:

SetAttributes[f, HoldAll] 
f[con] 
f[[email protected]] 
g[con] 
(* 
f[con] 
f[{u, 1, 10}] 
g[{u, 1, 10}] 
*) 

因此,看來,由於HoldAll屬性附加傷害,Manipulate根本沒有看到「內部」 con,除非你明確地評價它。

+1

你毆打我* * *!所以,+1 – Simon

+0

@Simon謝謝!也爲你+1。猜猜我最終會得到更少的讚揚:) – acl

+0

謝謝,當我複製並粘貼你的例子到一個新的工作表時,工程。在我的舊工作表中,我必須在每行上按Shift + Enter才能工作,即使在control = {u,1,10}的行中,它也沒有改變。爲什麼我必須重新評估線條? –

11

ManipulateHoldAll attribute。您可以強制control評估和一切工作正常

control = {u, 1, 10}; 
Manipulate[x[u], Evaluate[control]] 

的問題,這是變量u沒有正確定位,因此,如果您已經設置,例如,u=1某處,那麼Manipulate會返回一個錯誤。

如果您使用適當的範圍構造,例如WithDynamicModule,這可能會更好,具體取決於您要做什麼。

這也許是矯枉過正,但它可以確保u是本地和移動control外操縱的:

DynamicModule[{u}, With[{control = {u, 1, 10}}, Manipulate[x[u], control]]]