Parti [] dell'output di DynamicModule

Oct 31 2020

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:

  1. Qualcuno può spiegarlo? Le Parts di dm[[1]]non sembrano comportarsi come ci si aspetterebbe.

  2. Esiste un modo per accedere allo stato corrente dei 2 Plotin dme per esempio Showinsieme?

  3. Condivide la TreeFormdarci un'idea di come fare l'accesso Parts 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

4 Kuba Nov 02 2020 at 14:51

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.