Partes [] da saída do DynamicModule

Oct 31 2020

Eu respondi parcialmente a uma pergunta: Os controles de manipulação podem ser gerados programaticamente com base em uma variável (não manipulada)? , o que me levou a fazer minhas próprias perguntas.

Fundo:

O código a seguir produz um par de Sliders idênticos , onde definir um valor de 1 aparece no outro.

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

por exemplo,

Empacotar o código em um DynamicModuledá a você algo diferente, a capacidade de definir os Sliders independentemente (uma coisa possivelmente útil de fazer):

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]

Eu adicionei o Length, Dimensionse TreeFormpara entender melhor o que o código realmente produz.

Vamos explorar isso um pouco mais:

dm[[1]]
Length[%]

Observe, eu defino o Sliderpara 0.69depois de executar o código.

E agora tento extrair o Partsda expressão:

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

Isso parece um pouco estranho. Eu esperava obter os 3 Parts da dm[[1]]ordem, por exemplo:

Slider
Value
Plot

Então, algumas perguntas:

  1. Alguém pode explicar isso? Os programas Partde dm[[1]]não parecem se comportar como seria de se esperar.

  2. Existe uma maneira de acessar o estado atual dos 2 Plots em dme, por exemplo, Showeles juntos?

  3. Isso nos TreeFormdá alguma idéia de como fazer o acesso Parta tais expressões?

Eu percebo que essas perguntas podem se assemelhar a problemas de xadrez misterioso , com pouca aplicação no mundo real, mas espero que as respostas possam fornecer alguns insights adicionais sobre essas estruturas.

Respostas

4 Kuba Nov 02 2020 at 14:51

1- DynamicModulenão desaparece gosta Module. Após a avaliação inicial do conteúdo, ele permanece inerte e será usado quando for enviado como uma saída para produzir DynamicModuleBox, que rege o escopo em sua interface do usuário.

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

Este é dm[[1]]e tem dois argumentos e uma opção, o que significa que você obterá comprimento 3.

2- dmé apenas uma expressão como qualquer outra, Table[dm, {10}]contém 10 cópias independentes dela. Cada GUI gerada será independente. Se você deseja acessar os valores de dentro na maioria das vezes, você precisará fazer isso de dentro, por exemplo:

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

Agora você pode usar Dynamic @ notScopedXem outro lugar.

3- Claro que sim, assim como o InputFormpor exemplo. Sua forma de árvore diz que você pode acessar o primeiro controle deslizante com dm[[1, 2, 1]]. Mas esta é uma cópia do que foi usado para gerar a GUI anterior / posterior.

Avise-me se algo não estiver claro.