Teile [] der DynamicModule-Ausgabe
Ich gab eine teilweise Antwort auf die Frage: Können Manipulationssteuerelemente programmgesteuert basierend auf einer (nicht manipulierten) Variablen generiert werden? , was mich zu eigenen Fragen geführt hat.
Hintergrund:
Der folgende Code erzeugt ein Paar identischer Sliders, wobei das Setzen eines Wertes von 1 im anderen angezeigt wird.
{Slider[Dynamic[d], {0, 1, 0.01}],
Dynamic[d],
Dynamic[Plot[Sin[1 + d x], {x, -10 \[Pi], 10 \[Pi]}]]
} & /@ Range[2]
z.B,
Wenn Sie den Code in a DynamicModuleeinschließen, haben Sie etwas anderes, die Möglichkeit, das Sliders unabhängig einzustellen (eine möglicherweise nützliche Sache):
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]
Ich habe die hinzugefügt Length, Dimensionsund TreeFormbesser zu verstehen , was der Code tatsächlich produziert.
Lassen Sie uns dies etwas genauer untersuchen:
dm[[1]]
Length[%]
Hinweis, habe ich das Sliderzu , 0.69nachdem der Code ausgeführt wird .
Und jetzt versuche ich, Partsden Ausdruck zu extrahieren :
dm[[1, 1]]
dm[[1, 2]]
dm[[1, 3]]
Das scheint ein bisschen seltsam. Ich hätte erwartet, dass ich die 3 Parts dm[[1]]in Ordnung bringen würde, zB:
Slider
Value
Plot
Also einige Fragen:
Kann das jemand erklären? Die
Parts vondm[[1]]scheinen sich nicht so zu verhalten, wie man es erwarten würde.Gibt es eine Möglichkeit, auf den aktuellen Status der 2
Plots indmund zum BeispielShowzusammen zuzugreifen ?Gibt
TreeFormuns das einen Einblick, wie wir aufPartsolche Ausdrücke zugreifen können ?
Mir ist klar, dass diese Fragen ähnlich wie arkane Schachprobleme aussehen könnten , mit wenig realer Anwendung, aber ich hoffe, dass Antworten zusätzliche Einblicke in diese Strukturen geben könnten.
Antworten
1- DynamicModuleverschwindet nicht wie Module. Nach der ersten Auswertung des Inhalts bleibt er inert und wird verwendet, wenn er als Ausgabe gesendet wird, um eine DynamicModuleBox zu erstellen, die das Scoping innerhalb Ihrer GUI regelt.
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 :> {}
]
Dies ist dm[[1]]und es hat zwei Argumente und eine Option, was bedeutet, dass Sie Länge erhalten 3.
2- dmist nur ein Ausdruck wie jeder andere, Table[dm, {10}]enthält 10 unabhängige Kopien davon. Jede generierte GUI ist unabhängig. Wenn Sie am häufigsten von innen auf Werte zugreifen möchten, müssen Sie dies von innen tun, z.
DynamicModule[{x}, Slider @ Dynamic[x, (notScopedX = x = # )&]
Jetzt können Sie Dynamic @ notScopedXwoanders verwenden.
3- Sicher, genau wie InputFormzum Beispiel. Ihre Baumform besagt, dass Sie mit auf den ersten Schieberegler zugreifen können dm[[1, 2, 1]]. Dies ist jedoch eine Kopie dessen, was verwendet wurde, um die GUI früher / später zu generieren.
Lassen Sie mich wissen, wenn etwas nicht klar ist.