Partes [] da saída do DynamicModule
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:
Alguém pode explicar isso? Os programas
Partdedm[[1]]não parecem se comportar como seria de se esperar.Existe uma maneira de acessar o estado atual dos 2
Plots emdme, por exemplo,Showeles juntos?Isso nos
TreeFormdá alguma idéia de como fazer o acessoParta 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
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.