Partes [] de la salida de DynamicModule

Oct 31 2020

Di una respuesta parcial a una pregunta: ¿Se pueden generar controles de manipulación mediante programación en función de una variable (no manipulada)? , lo que me ha llevado a mis propias preguntas.

Fondo:

El siguiente código produce un par de Sliders idénticos , donde el establecimiento de un valor de 1 aparece en el otro.

   {Slider[Dynamic[d], {0, 1, 0.01}],
    Dynamic[d],
    Dynamic[Plot[Sin[1 + d x], {x, -10 \[Pi], 10 \[Pi]}]]
    } & /@ Range[2]

p.ej,

Envolver el código en a DynamicModulele brinda algo diferente, la capacidad de configurar los Sliders de forma independiente (una cosa posiblemente útil):

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]

He añadido el Length, Dimensionsy TreeFormpara comprender mejor lo que el código produce realmente.

Exploremos esto un poco más:

dm[[1]]
Length[%]

Tenga en cuenta que configuré el Slideren 0.69después de ejecutar el código.

Y ahora trato de extraer el Partsde la expresión:

dm[[1, 1]]
dm[[1, 2]]
dm[[1, 3]]

Esto parece un poco extraño. Hubiera esperado que obtuviera los 3 Parts dm[[1]]en orden, por ejemplo:

Slider
Value
Plot

Entonces, algunas preguntas:

  1. ¿Alguien puede explicar esto? Los Parts de dm[[1]]no parecen comportarse como cabría esperar.

  2. ¿Existe alguna forma de acceder al estado actual de los 2 Plots en dmy, por ejemplo, a Showellos juntos?

  3. ¿ TreeFormNos da alguna idea de cómo acceder a Parttales expresiones?

Me doy cuenta de que estas preguntas pueden parecerse a algo parecido a problemas arcanos de ajedrez , sin mucha aplicación en el mundo real, pero espero que las respuestas puedan dar una idea de trabajo adicional sobre estas estructuras.

Respuestas

4 Kuba Nov 02 2020 at 14:51

1- DynamicModuleno desaparece como Module. Después de la evaluación inicial del contenido, permanece inerte y se usará cuando se envíe como salida para producir DynamicModuleBox que gobierna el alcance dentro de su interfaz gráfica de usuario.

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 :> {}
]

Esto es dm[[1]]y tiene dos argumentos y una opción, lo que significa que obtendrá longitud 3.

2- dmes solo una expresión como cualquier otra, Table[dm, {10}]contiene 10 copias independientes de la misma. Cada GUI generada será independiente. Si desea acceder a los valores desde el interior con mayor frecuencia, deberá hacerlo desde el interior, por ejemplo:

DynamicModule[{x}, Slider @ Dynamic[x, (notScopedX = x = # )&]

Ahora puedes usarlo Dynamic @ notScopedXen otro lugar.

3- Claro que sí, como InputFormpor ejemplo. Su forma de árbol dice que puede acceder al primer control deslizante con dm[[1, 2, 1]]. Pero esta es una copia de lo que se usó para generar GUI antes / después.

Avísame si algo no está claro.