Części [] wyjścia DynamicModule

Oct 31 2020

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ń:

  1. Czy ktoś może to wyjaśnić? W Parts z dm[[1]]nie wydają się zachowywać jak można by oczekiwać.

  2. Czy istnieje sposób, aby uzyskać dostęp do aktualnego stanu 2 Plots w dmi na przykład Showje razem?

  3. Czy TreeFormdaje nam wgląd w to, jak uzyskać dostęp Partdo 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

4 Kuba Nov 02 2020 at 14:51

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.