2009-07-24 45 views
12

好吧,我這樣做:爲什麼不能這樣工作?動態的選擇

Select[Range[1, 20], # > Dynamic[q] &] 

然後我產生滑動:

Slider[Dynamic[q], {1, 20}] 

,它會始終返回一個空集!爲什麼!

更新 這樣做的目標是在移動滑塊時設置更改。

回答

29

關鍵是 請記住,動態並不直接控制任何評估。它所做的是在具有評估屬性的屏幕上創建一個點。

如果,例如,你要評估一個新的數學 會議的下列...

b=5; 
Dynamic[a=b]; 
b=6; 
Print[a]; 

...那麼什麼將被打印出來?不要立即評估,而應該在嘗試之前考慮 。提示......這是一個技巧性的問題,但理解這個技巧 會讓你大開眼界,正是Dynamic正在做的事情。

答案我不會在這裏透露(因爲你應該自己試試 !)可以解釋爲動態從未做過任何事情 因爲它從來沒有出現在屏幕上。分號禁止屏幕上的動態顯示,並且沒有出現在屏幕上,動態 的評估完成任何事情。

更微妙的是,如果刪除了所有的分號,打印【聲明(在 至少在我的機器上)仍然不變,但現在完全 不同的原因。這是因爲Dynamic的屏幕位置保證了 其內容將被評估,但他們將被評估。我的 示例設置了一個競爭條件,至少在我的機器在v7中, Shift + Enter評估獲勝。

要回到你的榜樣,

Select[Range[1, 20], # > Dynamic[q] &] 

這不工作,你認爲它是因爲動態在這種情況下 沒有計算到這是屏幕上顯示的東西的方式。

你可以平凡證明這樣做的結果...

Dynamic[Select[Range[1, 20], # > q &]] 

,但我會假設你不是在屏幕上顯示它只是感興趣,但 在設定某種副作用。也許你將Select分配給一個變量。 有兩種方法可以使這些副作用發生。一個是將它們放入Dynamic的第二個參數 。例如...

findset[x_] := (myset = Select[Range[1, 20], # > x &]) 
Slider[Dynamic[q, (q=#; myset = findset[q])&], {1, 20}] 

第二個是,以產生動態其確實有一個屏幕上的顯現,但一個 這是不顯着的。例如,

Row[{ 
    Slider[Dynamic[q], {1, 20}], 
    Dynamic[myset = Select[Range[1, 20], # > q &]; ""] 
}] 

在這種情況下,Dynamic實際上正在顯示。它顯示在 Slider旁邊。但是你沒有看到它,因爲它顯示的是一個空字符串。 儘管如此,它具有所有Dynamic具有的所有自動更新屬性。

有關更多信息,請閱讀Mathematica文檔中的開始和高級動態教程 。你也可以在comp.soft-sys.math.mathematica here上看到我的帖子(我對這個迴應進行了部分改寫)。

2

我想你想離開「動態」的選擇。這似乎當我發揮它的工作:

In[20]:= x = 5 

Out[20]= 5 

In[21]:= Slider[Dynamic[x], {1, 20}] 

Out[21]= \!\(\* 
SliderBox[Dynamic[$CellContext`x], {1, 20}]\) 

In[26]:= (*manually move the slider a bit to the right *) 

In[23]:= x 

Out[23]= 9.36 

In[24]:= Select[Range[1, 20], # > x &] 

Out[24]= {10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20} 

x = 2 (*slider moves left when I set this*) 

Out[25]= 2 

編輯:您的實際問題是:「爲什麼不這項工作」,而不是「我怎麼得到這個工作」。這裏的問題:

In[12]:= q = 3 

Out[12]= 3 


In[13]:= (# > q) &[10] 

Out[13]= True 


In[14]:= (# > Dynamic[q]) &[10] 

(* what you see on the screen looks like an evaluation that is held or something *) 
Out[14] = 10 > 3 

(* but the full form, which is conveniently what gets copied to the clipboard for 
    pasting into this answer, is actually this! *) 
Out[14]= 10 > \!\(\* 
DynamicBox[ToBoxes[$CellContext`q, StandardForm], 
ImageSizeCache->{7., {1., 8.}}]\) 

所以,如果你說「動態[1]」你得到一個「3」在屏幕上,但它不是一個真正的「3」 - 這是某種形式的筆記本元素的實際顯示'3'。

比較函數的結果是像上面這樣的表達式,它不計算爲True,所以select不接受任何元素,所以你得到一個空集合。

+0

那麼,你將x設置爲3,而不使用滑塊,並且因爲滑塊移動而高興。現在,這可能很有趣,但我的實驗的目標或希望是在滑動滑塊時更改SET。 – nes1983 2009-07-24 21:38:53

1

您希望整個初始Select表達式都是動態的,因爲只要q的值發生更改就想更新所選子集。您可以通過將Dynamic移到外面來完成此操作。試試這個吧:

Slider[Dynamic[q], {1, 20}] 

Dynamic[Select[Range[1, 20], # > q &]] 
相關問題