Bagian [] dari keluaran DynamicModule
Saya memberikan jawaban parsial untuk sebuah pertanyaan, Dapatkah kontrol Memanipulasi dibuat secara terprogram berdasarkan variabel (tidak dimanipulasi)? , yang telah membawa saya ke pertanyaan-pertanyaan saya sendiri.
Latar Belakang:
Kode berikut menghasilkan sepasang identik Slider, di mana pengaturan nilai 1 muncul di yang lain.
{Slider[Dynamic[d], {0, 1, 0.01}],
Dynamic[d],
Dynamic[Plot[Sin[1 + d x], {x, -10 \[Pi], 10 \[Pi]}]]
} & /@ Range[2]
misalnya,
Membungkus kode dalam a DynamicModulememberi Anda sesuatu yang berbeda, kemampuan untuk mengatur Sliders secara independen (hal yang mungkin berguna untuk dilakukan):
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]
Saya telah menambahkan Length, Dimensions, dan TreeFormuntuk lebih memahami apa kode benar-benar menghasilkan.
Mari kita telusuri ini lebih banyak:
dm[[1]]
Length[%]
Catatan, saya menyetel Sliderke 0.69setelah menjalankan kode.
Dan sekarang saya mencoba mengekstrak Partsekspresi:
dm[[1, 1]]
dm[[1, 2]]
dm[[1, 3]]
Ini sepertinya agak aneh. Saya berharap akan mendapatkan 3 Partdetik dm[[1]]secara berurutan, misalnya:
Slider
Value
Plot
Jadi, beberapa pertanyaan:
Adakah yang bisa menjelaskan ini? Para
Parts daridm[[1]]tampaknya tidak berperilaku seperti yang diharapkan.Apakah ada cara untuk mengakses kondisi 2
Plotdetik di dalamdm, dan misalnyaShowmereka bersama-sama?Apakah ini
TreeFormmemberi kita wawasan tentang bagaimana melakukan aksesPartekspresi seperti itu?
Saya menyadari bahwa pertanyaan-pertanyaan ini mungkin menyerupai sesuatu yang mirip dengan masalah catur misterius , dengan tidak banyak penerapan di dunia nyata, tetapi saya berharap jawaban tersebut dapat memberikan wawasan kerja tambahan tentang struktur ini.
Jawaban
1- DynamicModuletidak hilang seperti Module. Setelah evaluasi awal konten, konten tetap inert dan akan digunakan saat dikirim sebagai output untuk menghasilkan DynamicModuleBox yang mengatur pelingkupan dalam gui Anda.
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 :> {}
]
Ini dm[[1]]dan memiliki dua argumen dan satu opsi yang berarti Anda akan mendapatkan panjang 3.
2- dmhanyalah ekspresi seperti yang lain, Table[dm, {10}]berisi 10 salinan independennya. Setiap GUI yang dihasilkan akan independen. Jika Anda paling sering ingin mengakses nilai dari dalam, Anda perlu melakukan ini dari dalam, misalnya:
DynamicModule[{x}, Slider @ Dynamic[x, (notScopedX = x = # )&]
Sekarang Anda dapat menggunakan di Dynamic @ notScopedXtempat lain.
3- Tentu saja, seperti InputFormcontohnya. Bentuk pohon Anda mengatakan Anda dapat mengakses slider pertama dengan dm[[1, 2, 1]]. Tapi ini adalah salinan dari apa yang digunakan untuk menghasilkan GUI sebelumnya / nanti.
Beri tahu saya jika ada yang tidak jelas.