Parties [] de la sortie DynamicModule
J'ai donné une réponse partielle à une question: les contrôles Manipuler peuvent-ils être générés par programme en fonction d'une variable (non manipulée)? , ce qui m'a amené à poser mes propres questions.
Arrière-plan:
Le code suivant produit une paire de Sliders identiques , où la définition d'une valeur de 1 apparaît dans l'autre.
{Slider[Dynamic[d], {0, 1, 0.01}],
Dynamic[d],
Dynamic[Plot[Sin[1 + d x], {x, -10 \[Pi], 10 \[Pi]}]]
} & /@ Range[2]
par exemple,
Emballer le code dans un DynamicModulevous donne quelque chose de différent, la possibilité de définir le Sliders indépendamment (une chose peut-être utile à faire):
dm = DynamicModule[{d},
{Slider[Dynamic[d], {0, 1, 0.01}],
Dynamic[d],
Dynamic[Plot[Sin[1 + d x], {x, -10 \[Pi], 10 \[Pi]}]]
}] & /@ Range[2]
{"Length", Length[dm]}
{"Dimensions", Dimensions[dm]}
TreeForm[dm]
J'ai ajouté le Length, Dimensionset TreeFormpour mieux comprendre ce que le code produit réellement.
Explorons cela un peu plus:
dm[[1]]
Length[%]
Remarque, j'ai mis le Slidersur 0.69après avoir exécuté le code.
Et maintenant j'essaye d'extraire le Partsde l'expression:
dm[[1, 1]]
dm[[1, 2]]
dm[[1, 3]]
Cela semble un peu étrange. Je me serais attendu à ce que j'obtienne les 3 Parts de dm[[1]]dans l'ordre, par exemple:
Slider
Value
Plot
Alors, quelques questions:
Quelqu'un peut-il expliquer cela? Les
Parts dedm[[1]]ne semblent pas se comporter comme on pourrait s'y attendre.Existe-t-il un moyen d'accéder à l'état actuel des 2
Plots indm, et par exemple,Showles ensemble?Est-ce
TreeFormque cela nous donne un aperçu de la façon d'accéder àPartde telles expressions?
Je me rends compte que ces questions pourraient ressembler à quelque chose qui s'apparente à des problèmes d'échecs obscurs , avec peu d'application dans le monde réel, mais j'espère que les réponses pourraient donner un aperçu de travail supplémentaire sur ces structures.
Réponses
1- DynamicModulene disparaît pas comme Module. Après l'évaluation initiale du contenu, il reste inerte et sera utilisé lorsqu'il est envoyé en tant que sortie pour produire DynamicModuleBox qui régit la portée dans votre interface graphique.
dm[[1]] // InputForm
DynamicModule[
{d},
{Slider[Dynamic[d], {0, 1, 0.01}], Dynamic[d], Dynamic[Plot[Sin[1 + d*x], {x, -10*Pi, 10*Pi}]]},
DynamicModuleValues :> {}
]
C'est dm[[1]]et il a deux arguments et une option, ce qui signifie que vous obtiendrez de la longueur 3.
2- dmn'est qu'une expression comme une autre, en Table[dm, {10}]contient 10 copies indépendantes. Chaque interface graphique générée sera indépendante. Si vous souhaitez accéder aux valeurs de l'intérieur le plus souvent, vous devrez le faire de l'intérieur, par exemple:
DynamicModule[{x}, Slider @ Dynamic[x, (notScopedX = x = # )&]
Vous pouvez maintenant utiliser Dynamic @ notScopedXailleurs.
3- Bien sûr, tout comme le InputFormpar exemple. Votre forme d'arbre indique que vous pouvez accéder au premier curseur avec dm[[1, 2, 1]]. Mais ceci est une copie de ce qui a été utilisé pour générer une interface graphique plus tôt / plus tard.
Faites-moi savoir si quelque chose n'est pas clair.