2009-07-24 68 views

Trả lời

29

Điều quan trọng là hãy nhớ rằng Động không kiểm soát bất kỳ điều gì về đánh giá trực tiếp. Những gì nó làm là tạo ra một vị trí trên màn hình có tính chất đánh giá.

Nếu, ví dụ, bạn đã đánh giá sau đây trong một phiên Mathematica tươi ...

b=5; 
Dynamic[a=b]; 
b=6; 
Print[a]; 

... thì những gì sẽ được in? Thay vì đánh giá nó ngay lập tức, hãy suy nghĩ về trước khi bạn thử. Gợi ý ... nó là một câu hỏi lừa, nhưng sự hiểu biết lừa sẽ mở tâm trí của bạn để chính xác những gì năng động đang làm.

Câu trả lời, mà tôi sẽ không tiết lộ ở đây (vì bạn thực sự nên thử nó cho mình!) Có thể được giải thích bởi thực tế là động không bao giờ làm bất cứ điều gì bởi vì nó không bao giờ xuất hiện trên màn hình. Dấu chấm phẩy ngăn cản sự xuất hiện trên màn hình trên màn hình động và không xuất hiện trên màn hình, việc đánh giá Dynamic không thành công.

tinh tế hơn, nếu bạn loại bỏ tất cả các dấu chấm phẩy, Print [] statement (tại nhất trên máy tính của tôi) vẫn vẫn không thay đổi, nhưng bây giờ vì một lý do hoàn toàn khác nhau . Đó là do vị trí trên màn hình của Dynamic đảm bảo rằng nội dung của nó sẽ được đánh giá, nhưng không được đánh giá là khi chúng sẽ được đánh giá. Ví dụ của tôi thiết lập điều kiện chủng tộc, ít nhất là trên máy tính của tôi ở phiên bản 7, thì đánh giá Shift + Enter sẽ thắng .

Để quay trở lại ví dụ của bạn,

Select[Range[1, 20], # > Dynamic[q] &] 

này không hoạt động theo cách bạn nghĩ rằng nó không vì động trong trường hợp này không đánh giá một cái gì đó mà sẽ được hiển thị trên màn hình.

Bạn trivially có thể chứng minh kết quả bằng cách làm ...

Dynamic[Select[Range[1, 20], # > q &]] 

nhưng tôi sẽ giả sử bạn không chỉ quan tâm đến việc hiển thị nó trên màn hình, nhưng trong việc thiết một số loại tác dụng phụ. Có lẽ bạn đã chỉ định Chọn cho một biến. Có hai cách để làm cho các tác dụng phụ này xảy ra. Một là đặt chúng vào đối số thứ hai của động số . Ví dụ:

findset[x_] := (myset = Select[Range[1, 20], # > x &]) 
Slider[Dynamic[q, (q=#; myset = findset[q])&], {1, 20}] 

Thứ hai là tạo ra một Dynamic có giao diện trên màn hình, nhưng không đáng chú ý. Ví dụ:

Row[{ 
    Slider[Dynamic[q], {1, 20}], 
    Dynamic[myset = Select[Range[1, 20], # > q &]; ""] 
}] 

Trong trường hợp này, Dynamic đang hiển thị. Nó hiển thị ngay bên cạnh thanh trượt . Nhưng bạn không thấy nó bởi vì những gì nó hiển thị là một chuỗi rỗng. Tuy nhiên, nó có tất cả các thuộc tính cập nhật tự động mà bất kỳ Dynamic nào có.

Để biết thêm thông tin, bạn nên đọc phần Hướng dẫn động đầu tiên và nâng cao trong tài liệu Mathematica. Bạn cũng có thể xem bài đăng của tôi trên comp.soft-sys.math.mathematica here (mà tôi đã được định dạng lại một phần cho phản hồi này).

2

Tôi nghĩ bạn muốn rời khỏi "Động" trong số các lựa chọn. Điều này dường như hoạt động khi tôi chơi với nó:

In[20]:= x = 5 

Out[20]= 5 

In[21]:= Slider[Dynamic[x], {1, 20}] 

Out[21]= \!\(\* 
SliderBox[Dynamic[$CellContext`x], {1, 20}]\) 

In[26]:= (*manually move the slider a bit to the right *) 

In[23]:= x 

Out[23]= 9.36 

In[24]:= Select[Range[1, 20], # > x &] 

Out[24]= {10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20} 

x = 2 (*slider moves left when I set this*) 

Out[25]= 2 

EDIT: Câu hỏi thực tế của bạn là "làm cách nào để thực hiện điều này". Đây là vấn đề:

In[12]:= q = 3 

Out[12]= 3 


In[13]:= (# > q) &[10] 

Out[13]= True 


In[14]:= (# > Dynamic[q]) &[10] 

(* what you see on the screen looks like an evaluation that is held or something *) 
Out[14] = 10 > 3 

(* but the full form, which is conveniently what gets copied to the clipboard for 
    pasting into this answer, is actually this! *) 
Out[14]= 10 > \!\(\* 
DynamicBox[ToBoxes[$CellContext`q, StandardForm], 
ImageSizeCache->{7., {1., 8.}}]\) 

Vì vậy, nếu bạn nói 'Động [1]' bạn nhận được '3' trên màn hình, nhưng nó không thực sự là '3' - đó là một loại yếu tố sổ tay thực sự hiển thị a '3'.

Kết quả của hàm so sánh là một biểu thức như ở trên, không đánh giá là True, do đó, chọn không chấp nhận bất kỳ phần tử nào, do đó bạn nhận được bộ trống.

+0

Vâng, bạn đang đặt x thành 3, không sử dụng thanh trượt và vui mừng vì thanh trượt di chuyển. Bây giờ, điều đó có thể thú vị, nhưng mục tiêu, hoặc hy vọng, của thử nghiệm của tôi là thay đổi SET, khi tôi trượt thanh trượt. – nes1983

+0

Nếu bạn đánh giá lại câu lệnh Select, mà không có 'Động' trong đó, bạn sẽ nhận được một bộ mới. Nếu bạn muốn thiết lập tự thay đổi ... Tôi không biết! – Eric

1

Bạn muốn toàn bộ biểu thức Select ban đầu là động, bởi vì bạn muốn cập nhật tập hợp con đã chọn bất cứ khi nào giá trị của q thay đổi. Bạn có thể thực hiện việc này bằng cách di chuyển bên ngoài Dynamic. Hãy thử điều này:

Slider[Dynamic[q], {1, 20}] 

Dynamic[Select[Range[1, 20], # > q &]] 
Các vấn đề liên quan