Parti [] dell'output di DynamicModule
Ho dato una risposta parziale a una domanda: i controlli Manipulate possono essere generati a livello di codice in base a una variabile (non manipolata)? , che mi ha portato a fare domande mie.
Sfondo:
Il codice seguente produce una coppia di Sliders identiche , dove l'impostazione di un valore di 1 viene visualizzata nell'altro.
{Slider[Dynamic[d], {0, 1, 0.01}],
Dynamic[d],
Dynamic[Plot[Sin[1 + d x], {x, -10 \[Pi], 10 \[Pi]}]]
} & /@ Range[2]
per esempio,
Avvolgere il codice in una DynamicModuleti dà qualcosa di diverso, la possibilità di impostare le Sliders in modo indipendente (una cosa forse utile da fare):
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]
Ho aggiunto la Length, Dimensionse TreeFormper capire meglio ciò che il codice produce in realtà.
Esploriamo questo un po 'di più:
dm[[1]]
Length[%]
Nota, ho impostato Slidersu 0.69dopo aver eseguito il codice.
E ora provo a estrarre Partsil valore dell'espressione:
dm[[1, 1]]
dm[[1, 2]]
dm[[1, 3]]
Sembra un po 'strano. Mi sarei aspettato di ottenere i 3 Parts dm[[1]]in ordine, ad esempio:
Slider
Value
Plot
Quindi, alcune domande:
Qualcuno può spiegarlo? Le
Parts didm[[1]]non sembrano comportarsi come ci si aspetterebbe.Esiste un modo per accedere allo stato corrente dei 2
Plotindme per esempioShowinsieme?Condivide la
TreeFormdarci un'idea di come fare l'accessoParts di tali espressioni?
Mi rendo conto che queste domande potrebbero assomigliare a qualcosa di simile a problemi di scacchi arcani , con poche applicazioni nel mondo reale, ma spero che le risposte possano fornire alcune informazioni operative aggiuntive su queste strutture.
Risposte
1- DynamicModulenon scompare come Module. Dopo la valutazione iniziale del contenuto, rimane inerte e verrà utilizzato quando viene inviato come output per produrre DynamicModuleBox che regola l'ambito all'interno della gui.
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 :> {}
]
Questo è dm[[1]]e ha due argomenti e un'opzione che significa che otterrai la lunghezza 3.
2- dmè solo un'espressione come le altre, ne Table[dm, {10}]contiene 10 copie indipendenti. Ogni GUI generata sarà indipendente. Se vuoi accedere ai valori dall'interno il più delle volte dovrai farlo dall'interno, ad esempio:
DynamicModule[{x}, Slider @ Dynamic[x, (notScopedX = x = # )&]
Ora puoi usarlo Dynamic @ notScopedXda qualche altra parte.
3- Certo che lo fa, proprio come il InputFormper esempio. Il tuo modulo ad albero dice che puoi accedere al primo cursore con dm[[1, 2, 1]]. Ma questa è una copia di ciò che è stato utilizzato per generare la GUI prima / dopo.
Fammi sapere se qualcosa non è chiaro.