Bagian [] dari keluaran DynamicModule

Oct 31 2020

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:

  1. Adakah yang bisa menjelaskan ini? Para Parts dari dm[[1]]tampaknya tidak berperilaku seperti yang diharapkan.

  2. Apakah ada cara untuk mengakses kondisi 2 Plotdetik di dalam dm, dan misalnya Showmereka bersama-sama?

  3. Apakah ini TreeFormmemberi kita wawasan tentang bagaimana melakukan akses Partekspresi 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

4 Kuba Nov 02 2020 at 14:51

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.