Các phần [] của đầu ra DynamicModule
Tôi đã trả lời một phần cho câu hỏi, Điều khiển thao tác có thể được tạo theo chương trình dựa trên một biến (không thao tác) không? , điều này đã dẫn tôi đến những câu hỏi của riêng tôi.
Lý lịch:
Đoạn mã sau tạo ra một cặp Sliders giống hệt nhau , trong đó cài đặt giá trị 1 hiển thị trong mã còn lại.
{Slider[Dynamic[d], {0, 1, 0.01}],
Dynamic[d],
Dynamic[Plot[Sin[1 + d x], {x, -10 \[Pi], 10 \[Pi]}]]
} & /@ Range[2]
ví dụ,
Gói mã trong một DynamicModulecung cấp cho bạn một cái gì đó khác biệt, khả năng thiết lập các Sliders một cách độc lập (một điều có thể hữu ích để làm):
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]
Tôi đã thêm Length, Dimensionsvà TreeFormđể hiểu rõ hơn về những gì các mã thực sự tạo ra.
Hãy khám phá điều này thêm một chút:
dm[[1]]
Length[%]
Lưu ý, tôi đặt Sliderđể 0.69sau khi thực hiện mã.
Và bây giờ tôi cố gắng trích xuất Partsbiểu thức:
dm[[1, 1]]
dm[[1, 2]]
dm[[1, 3]]
Điều này có vẻ hơi lạ. Tôi đã mong đợi rằng tôi sẽ nhận được 3 Parts dm[[1]]theo thứ tự, ví dụ:
Slider
Value
Plot
Vì vậy, một số câu hỏi:
Ai đó có thể giải thích điều này? Các
Parts củadm[[1]]không xuất hiện để hành xử như người ta mong đợi.Có cách nào tồn tại để truy cập trạng thái hiện tại của 2
Plots trongdmvà ví dụ nhưShowchúng cùng nhau không?Có
TreeFormcung cấp cho chúng ta bất kỳ cái nhìn sâu sắc nào về cách thực hiện truy cậpPartcác biểu thức như vậy không?
Tôi nhận ra rằng những câu hỏi này có thể giống với những bài toán cờ phức tạp , không có nhiều ứng dụng trong thế giới thực, nhưng tôi hy vọng rằng câu trả lời có thể cung cấp thêm một số thông tin chi tiết về các cấu trúc này.
Trả lời
1- DynamicModulekhông biến mất như thế nào Module. Sau khi đánh giá nội dung ban đầu, nó vẫn ở trạng thái trơ và sẽ được sử dụng khi nó được gửi làm đầu ra để tạo DynamicModuleBox điều chỉnh phạm vi trong gui của bạn.
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 :> {}
]
Đây là dm[[1]]và nó có hai đối số và một tùy chọn có nghĩa là bạn sẽ nhận được độ dài 3.
2- dmchỉ là một biểu thức như bất kỳ biểu thức nào khác, Table[dm, {10}]chứa 10 bản sao độc lập của nó. Mỗi GUI được tạo sẽ độc lập. Nếu bạn muốn truy cập các giá trị từ bên trong thường xuyên nhất, bạn sẽ cần phải làm điều này từ bên trong, ví dụ:
DynamicModule[{x}, Slider @ Dynamic[x, (notScopedX = x = # )&]
Bây giờ bạn có thể sử dụng Dynamic @ notScopedXở một nơi khác.
3- Chắc chắn rồi, giống như InputFormví dụ. Biểu mẫu cây của bạn cho biết bạn có thể truy cập thanh trượt đầu tiên với dm[[1, 2, 1]]. Nhưng đây là bản sao của những gì đã được sử dụng để tạo GUI trước đó / sau này.
Hãy cho tôi biết nếu có gì không rõ ràng.