2009-07-24 9 views
12

Ok, hago esto:¿Por qué no funciona? Dinámica en un Seleccionar

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

Y luego creo el control deslizante:

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

Y siempre voy a volver un conjunto vacío! ¡Por qué!

Actualización El objetivo de esto es hacer que el conjunto cambie a medida que muevo el control deslizante.

Respuesta

29

La clave es Recuerde que Dynamic no controla nada sobre la evaluación directamente. Lo que hace es crear un lugar en la pantalla que tiene propiedades de evaluación.

Si, por ejemplo, se va a evaluar lo siguiente en una nueva sesión de Mathematica ...

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

... entonces lo que se imprimirá? En lugar de evaluarlo de inmediato, piense en antes de probarlo. Sugerencia ... es una pregunta capciosa, pero entender el truco le abrirá la mente a lo que Dynamic está haciendo exactamente.

La respuesta, que no voy a revelar aquí (¡porque realmente debería intentarlo para !) Puede explicarse por el hecho de que Dynamic nunca hizo nada porque nunca apareció en la pantalla. El punto y coma inhibió la aparición en pantalla de dinámica, y sin aparecer en pantalla, la evaluación de Dynamic no logra nada.

De manera más sutil, si se quita todos los puntos y comas, la impresión [] Declaración (en menos en mi máquina) todavía se mantiene sin cambios, pero ahora por una razón completamente diferente . Esto se debe a que la colocación en pantalla de una Dynamic garantiza que su contenido será evaluado, pero no cuando serán evaluados. Mi ejemplo establece una condición de carrera que, al menos en mi máquina en v7, la evaluación Shift + Enter gana.

Para volver a su ejemplo,

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

Esto no funciona de la manera que pensamos que lo hace debido a que la dinámica en este caso no se está evaluando a algo que se muestra en pantalla.

Se podría demostrar trivialmente el resultado haciendo ...

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

pero voy a suponer que no estaban interesados ​​sólo en la visualización en la pantalla, pero en el establecimiento de algún tipo de efecto secundario. Tal vez estabas asignando Seleccionar a una variable. Hay dos formas de que ocurran estos efectos secundarios. Una es ponerlos en el segundo argumento de Dynamic. Por ejemplo ...

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

La segunda es producir una dinámica que tiene una apariencia en pantalla, pero una que no es perceptible. Por ejemplo,

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

En este caso, el Dynamic realmente se está mostrando. Se muestra junto al control deslizante . Pero no lo ves porque lo que se muestra es una cadena vacía. No obstante, tiene todas las propiedades de actualización automática que cualquier Dynamic tiene.

Para obtener más información, debe leer los tutoriales dinámicos avanzados y avanzados en la documentación de Mathematica. También puede ver mi publicación en comp.soft-sys.math.mathematica here (que reformulé en parte para esta respuesta).

2

Creo que quiere dejar "Dinámico" fuera de la selección. Esto parece funcionar cuando juego con él:

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: Su pregunta real era, "¿por qué no este trabajo" en lugar de "¿Cómo consigo que esto funcione". Aquí está el 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.}}]\) 

Así que si usted dice 'dinámico [1]' Lo que se obtiene un '3' en la pantalla, pero no es realmente un '3' - que es algún tipo de elemento portátil que realmente muestra a '3'.

El resultado de la función de comparación es una expresión como la anterior, que no se evalúa como Verdadero, por lo que select no acepta ningún elemento, por lo que obtiene un conjunto vacío.

+0

Bueno, está configurando x a 3, sin usar el control deslizante, y se regocija porque el control deslizante se mueve. Ahora, eso podría ser interesante, pero el objetivo, o la esperanza, de mi experimentación era cambiar el SET, mientras deslizo el control deslizante. – nes1983

+0

Si vuelve a evaluar la instrucción Seleccionar, sin el 'Dinámico' en ella, entonces obtiene un nuevo conjunto. Si quieres que el conjunto cambie por sí mismo ... ¡No sé! – Eric

1

Desea que la totalidad de la expresión inicial Select sea dinámica, porque desea actualizar el subconjunto seleccionado siempre que cambie el valor de q. Puede hacer esto moviendo el Dynamic afuera. Pruebe esto:

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

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