2009-07-24 3 views

Répondre

29

La clé est de rappelez-vous que Dynamic ne contrôle rien sur l'évaluation directement. Ce qu'il fait est de créer un endroit sur l'écran qui a des propriétés d'évaluation.

Si, par exemple, vous deviez évaluer les éléments suivants dans une nouvelle Mathematica session ...

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

... alors ce qui sera imprimé? Au lieu de l'évaluer immédiatement, pensez à avant de l'essayer. Astuce ... c'est une question piège, mais comprendre l'astuce va ouvrir votre esprit à exactement ce que fait Dynamic. La réponse, que je ne vais pas révéler ici (parce que vous devriez vraiment l'essayer pour vous-même!) Peut s'expliquer par le fait que la Dynamique n'a jamais fait quoi que ce soit car elle ne s'est jamais montrée à l'écran. Le point-virgule a inhibé l'apparition de Dynamic à l'écran , et sans apparaître à l'écran, l'évaluation de Dynamic n'aboutit à rien.

Plus subtilement, si vous supprimez tous les points-virgules, la déclaration d'impression [] (à moins sur ma machine) encore reste inchangé, mais maintenant pour une toute autre raison . C'est parce que le placement à l'écran d'un Dynamic garantit que son contenu sera évalué, mais pas quand ils seront évalués. Mon exemple met en place une condition de concurrence qui, au moins sur ma machine en v7, l'évaluation Maj + Entrée gagne.

Pour revenir à votre exemple,

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

Cela ne fonctionne pas la façon dont vous pensez qu'elle parce que la dynamique dans ce cas n'évalue pas à quelque chose qui est affiché à l'écran.

Vous pouvez trivialement démontrer le résultat en faisant ...

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

mais je suppose que vous étiez pas seulement intéressés à l'afficher sur l'écran, mais à mettre une sorte d'effet secondaire. Peut-être que vous étiez en train d'assigner Select à une variable. Il existe deux façons de provoquer ces effets secondaires. L'une est de les mettre dans le deuxième argument de Dynamic. Par exemple ...

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

La seconde est de produire une dynamique qui fait une apparition à l'écran ont, mais qui ne se remarque pas. Par exemple,

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

Dans ce cas, Dynamic affiche actuellement. Il s'affiche juste à côté du curseur . Mais vous ne le voyez pas parce que ce qu'il affiche est une chaîne vide. Néanmoins, il possède toutes les propriétés de mise à jour automatique que n'importe quel Dynamic a.

Pour plus d'informations, vous devez lire les didacticiels dynamiques débutants et avancés dans la documentation de Mathematica. Vous pouvez également voir mon post sur comp.soft-sys.math.mathematica here (que j'ai partiellement reformulé pour cette réponse).

2

Je pense que vous voulez laisser "Dynamic" hors de la sélection. Cela semble fonctionner quand je joue avec elle:

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: Votre question est réelle, « pourquoi ne pas ce travail » au lieu de « comment puis-je obtenir ce travail ». Voici le problème:

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

Donc, si vous dites « Dynamic [1] » vous obtenez un « 3 » sur l'écran, mais il est pas vraiment un « 3 » - c'est une sorte d'élément portable qui fait affiche un '3'. Le résultat de la fonction de comparaison est une expression comme ci-dessus, qui n'évalue pas à True, donc la sélection n'accepte aucun élément, donc vous obtenez un ensemble vide.

+0

Eh bien, vous définissez x à 3, sans utiliser le curseur, et réjouissez-vous car le curseur se déplace. Maintenant, cela pourrait être intéressant, mais le but, ou l'espoir, de mon expérimentation était de changer le SET, comme je fais glisser le curseur. – nes1983

+0

Si vous réévaluez l'instruction Select, sans le 'Dynamic', alors vous obtenez un nouvel ensemble. Si vous voulez que l'ensemble change tout seul ... je ne sais pas! – Eric

1

Vous souhaitez que l'intégralité de l'expression initiale Select soit dynamique, car vous souhaitez mettre à jour le sous-ensemble sélectionné lorsque la valeur de q change. Vous pouvez le faire en déplaçant le Dynamic à l'extérieur. Essayez ceci:

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

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