Части [] вывода DynamicModule

Oct 31 2020

Я дал частичный ответ на вопрос: можно ли управлять элементами управления программно на основе (не изменяемой) переменной? , что навело меня на собственные вопросы.

Задний план:

Следующий код создает пару одинаковых Sliders, где установка значения 1 отображается в другом.

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

например,

Обертывание кода в a DynamicModuleдает вам что-то другое, возможность устанавливать Sliders независимо (возможно, полезная вещь):

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]

Я добавил Length, Dimensionsи , TreeFormчтобы лучше понять , что на самом деле производит код.

Давайте рассмотрим это немного подробнее:

dm[[1]]
Length[%]

Обратите внимание: я установил Sliderзначение 0.69после выполнения кода.

А теперь я пытаюсь извлечь Partsиз выражения:

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

Это кажется немного странным. Я ожидал, что получу 3 Partс по dm[[1]]порядку, например:

Slider
Value
Plot

Итак, несколько вопросов:

  1. Кто-нибудь может это объяснить? В Partе годы, dm[[1]]кажется , не ведут себя , как можно было бы ожидать.

  2. Существует ли способ получить доступ к текущему состоянию двух Plotвходов dmи, например, Showих вместе?

  3. Дает ли TreeFormнам какое-нибудь представление о том, как получить доступ Partк таким выражениям?

Я понимаю, что эти вопросы могут напоминать что-то вроде загадочных шахматных задач , не имеющих большого практического применения, но я надеюсь, что ответы могут дать дополнительное рабочее понимание этих структур.

Ответы

4 Kuba Nov 02 2020 at 14:51

1- DynamicModuleне пропадает вроде Module. После первоначальной оценки содержимого он остается инертным и будет использоваться при отправке в качестве вывода для создания DynamicModuleBox, который управляет областью действия в вашем графическом интерфейсе.

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

Это так, dm[[1]]и у него есть два аргумента и один вариант, что означает, что вы получите длину 3.

2- dmэто просто выражение, как и любое другое, Table[dm, {10}]содержит 10 его независимых копий. Каждый сгенерированный графический интерфейс будет независимым. Если вы хотите получить доступ к значениям изнутри чаще всего, вам нужно будет сделать это изнутри, например:

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

Теперь вы можете использовать в Dynamic @ notScopedXдругом месте.

3- Конечно, как InputFormнапример. В вашей древовидной форме говорится, что вы можете получить доступ к первому слайдеру с помощью dm[[1, 2, 1]]. Но это копия того, что использовалось для генерации графического интерфейса ранее / позже.

Дайте мне знать, если что-то непонятно.