Części [] wyjścia DynamicModule
Udzieliłem częściowej odpowiedzi na pytanie, czy kontrolki Manipulate mogą być generowane programowo na podstawie (niemanipulowanej) zmiennej? , co doprowadziło mnie do własnych pytań.
Tło:
Poniższy kod tworzy parę identycznych Sliders, gdzie ustawienie wartości 1 pojawia się w drugim.
{Slider[Dynamic[d], {0, 1, 0.01}],
Dynamic[d],
Dynamic[Plot[Sin[1 + d x], {x, -10 \[Pi], 10 \[Pi]}]]
} & /@ Range[2]
na przykład,
Opakowanie kodu w a DynamicModuledaje coś innego, możliwość Sliderniezależnego ustawiania s (prawdopodobnie przydatna rzecz do zrobienia):
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]
Dodałem Length, Dimensionsi TreeFormaby lepiej zrozumieć, co kod faktycznie produkuje.
Przyjrzyjmy się temu nieco dokładniej:
dm[[1]]
Length[%]
Uwaga, ustawić Slideraby 0.69po wykonaniu kodu.
A teraz spróbuję wyodrębnić Partswyrażenie:
dm[[1, 1]]
dm[[1, 2]]
dm[[1, 3]]
Wydaje się to trochę dziwne. Spodziewałbym się, że dostanę 3 Parts dm[[1]]w kolejności, np:
Slider
Value
Plot
A więc kilka pytań:
Czy ktoś może to wyjaśnić? W
Parts zdm[[1]]nie wydają się zachowywać jak można by oczekiwać.Czy istnieje sposób, aby uzyskać dostęp do aktualnego stanu 2
Plots wdmi na przykładShowje razem?Czy
TreeFormdaje nam wgląd w to, jak uzyskać dostępPartdo takich wyrażeń?
Zdaję sobie sprawę, że te pytania mogą przypominać coś w rodzaju tajemniczych problemów szachowych , z niewielkim zastosowaniem w prawdziwym świecie, ale mam nadzieję, że odpowiedzi mogą dać dodatkowy praktyczny wgląd w te struktury.
Odpowiedzi
1- DynamicModulenie znika jak Module. Po wstępnej ocenie zawartości pozostaje on nieaktywny i zostanie użyty, gdy zostanie wysłany jako dane wyjściowe do utworzenia DynamicModuleBox, który zarządza zakresem w twoim 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 :> {}
]
To jest dm[[1]]i ma dwa argumenty i jedną opcję, co oznacza, że otrzymasz długość 3.
2- dmjest po prostu wyrażeniem jak każde inne, Table[dm, {10}]zawiera 10 niezależnych kopii. Każdy wygenerowany GUI będzie niezależny. Jeśli chcesz uzyskać dostęp do wartości od wewnątrz, najczęściej będziesz musiał to zrobić od wewnątrz, np .:
DynamicModule[{x}, Slider @ Dynamic[x, (notScopedX = x = # )&]
Teraz możesz użyć Dynamic @ notScopedXgdzie indziej.
3- Pewnie, że tak, jak InputFormna przykład. Twoje drzewo mówi, że możesz uzyskać dostęp do pierwszego suwaka za pomocą dm[[1, 2, 1]]. Ale to jest kopia tego, co zostało użyte do wygenerowania GUI wcześniej / później.
Daj mi znać, jeśli coś nie jest jasne.