2009-07-24 48 views
12

Ok, faccio questo:Perché non funziona? Dinamica in una Select

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

E poi creo il dispositivo di scorrimento:

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

e sarà sempre restituire un insieme vuoto! Perché!

Aggiornamento L'obiettivo è di far cambiare l'impostazione mentre si sposta il cursore.

risposta

29

La chiave è per ricordare che Dynamic non controlla direttamente nulla sulla valutazione. Quello che fa è creare un punto sullo schermo che abbia proprietà di valutazione.

Se, ad esempio, si dovesse valutare la segue in un Mathematica sessione di fresco ...

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

... allora ciò che verrà stampato? Invece di valutarlo immediatamente, pensa a prima di provarlo. Suggerimento ... è una domanda trabocchetto, ma capire il trucco ti aprirà la mente a ciò che sta facendo Dynamic.

La risposta, che non rivelerò qui (perché dovresti provarla davvero per !) Può essere spiegata dal fatto che la Dinamica non ha mai fatto nulla perché non si è mai mostrata sullo schermo. Il punto e virgola ha inibito l'aspetto di Dynamic su schermo e, senza apparire sullo schermo, la valutazione di Dynamic non ha effetto.

Più sottilmente, se si rimuove tutti i punti e virgola, di stampa [] dichiarazione (a almeno sulla mia macchina) ancora rimane invariato, ma ora per un motivo completamente diverso . Questo perché il posizionamento su schermo di una Dynamic garantisce che il suo contenuto sarà valutato, ma non quando sarà valutato. L'esempio imposta una condizione di competizione che, almeno sulla mia macchina in v7, vince la valutazione di spostamento + Invio di Shift + Invio.

Per tornare al tuo esempio,

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

Questo non funziona il modo di pensare lo fa perché la dinamica in questo caso non sta valutando a qualcosa che viene visualizzato sullo schermo.

Si potrebbe banalmente dimostrare il risultato facendo ...

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

ma darò per scontato che non eri solo interessati a visualizzarlo sullo schermo, ma nella creazione di una sorta di effetto collaterale. Forse stavi assegnando Seleziona a una variabile. Ci sono due modi per far accadere questi effetti collaterali. Uno è metterli nel secondo argomento di di Dinamico. Per esempio ...

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

Il secondo è quello di produrre una dinamica che ha un aspetto sullo schermo, ma che non è evidente. Ad esempio,

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

In questo caso, la dinamica viene effettivamente visualizzata. Viene visualizzato accanto al dispositivo di scorrimento . Ma non lo vedi perché ciò che sta visualizzando è una stringa vuota. Tuttavia, ha tutte le proprietà di aggiornamento automatico di qualsiasi Dynamic.

Per ulteriori informazioni, è necessario leggere l'inizio e le esercitazioni dinamiche avanzate nella documentazione di Mathematica. Puoi anche vedere il mio post su comp.soft-sys.math.mathematica here (che ho in parte riformulato per questa risposta).

2

Penso che tu voglia lasciare "Dinamico" fuori dalla selezione. Questo sembra funzionare quando gioco con esso:

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 

EDIT: La tua domanda effettiva è stata, "perché non questo lavoro" invece di "Come faccio ad avere questo lavoro". Ecco il problema:

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.}}]\) 

Quindi, se si dice 'dinamico [1]' è possibile prendere un '3' sullo schermo, ma non è davvero un '3' - è una sorta di elemento di notebook che in realtà visualizza a '3'.

Il risultato della funzione di confronto è un'espressione come la precedente, che non restituisce True, quindi select non accetta alcun elemento, quindi si ottiene un set vuoto.

+0

Bene, si imposta x su 3, senza utilizzare il cursore e si rallegra perché si muove il cursore. Ora, potrebbe essere interessante, ma l'obiettivo, o la speranza, della mia sperimentazione era cambiare il SET, mentre faccio scorrere il cursore. – nes1983

+0

Se rivaluti l'istruzione Select, senza la 'Dinamica' al suo interno, ottieni un nuovo set. Se vuoi che il set cambi da solo ... Non lo so! – Eric

1

Si desidera che l'intera espressione iniziale Select sia dinamica, poiché si desidera aggiornare il sottoinsieme selezionato ogni volta che cambia il valore di q. È possibile farlo spostando il Dynamic all'esterno. Prova questo:

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

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