Части [] вывода DynamicModule
Я дал частичный ответ на вопрос: можно ли управлять элементами управления программно на основе (не изменяемой) переменной? , что навело меня на собственные вопросы.
Задний план:
Следующий код создает пару одинаковых 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
Итак, несколько вопросов:
Кто-нибудь может это объяснить? В
Partе годы,dm[[1]]кажется , не ведут себя , как можно было бы ожидать.Существует ли способ получить доступ к текущему состоянию двух
Plotвходовdmи, например,Showих вместе?Дает ли
TreeFormнам какое-нибудь представление о том, как получить доступPartк таким выражениям?
Я понимаю, что эти вопросы могут напоминать что-то вроде загадочных шахматных задач , не имеющих большого практического применения, но я надеюсь, что ответы могут дать дополнительное рабочее понимание этих структур.
Ответы
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]]. Но это копия того, что использовалось для генерации графического интерфейса ранее / позже.
Дайте мне знать, если что-то непонятно.