Почему это не будет работать? Динамичный в Выборе

Единственное время я использую структуру вместо класса, при объявлении функтора прямо перед использованием его в вызове функции, и хотят минимизировать синтаксис ради ясности. например:

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 
12
задан nes1983 24 July 2009 в 21:37
поделиться

3 ответа

Ключ к помните, что Dynamic ничего не контролирует напрямую. Что он делает, так это создает на экране место, которое имеет свойства оценки.

Если, например, вы должны были оценить следующее в новой системе Mathematica сессия ...

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

... что тогда будет печататься? Вместо того, чтобы сразу оценивать это, подумайте о это перед тем, как попробовать. Подсказка ... это вопрос с подвохом, но понимание хитрости откроет ваш разум для того, что именно делает Dynamic.

Ответ, который я не буду раскрывать здесь (потому что вам действительно стоит попробовать это для себя!) можно объяснить тем, что Dynamic никогда ничего не делал потому что он никогда не появлялся на экране. Точка с запятой подавляла отображение на экране внешний вид Dynamic, и без отображения на экране оценка Dynamic ничего не дает.

Более тонко, если вы удалите все точки с запятой, оператор Print [] (at по крайней мере, на моей машине) по-прежнему остается без изменений, но теперь полностью другая причина. Это потому, что размещение Dynamic на экране гарантирует что его содержимое будет оцениваться, но не , когда оно будет оцениваться. Мой пример устанавливает состояние гонки, которое, по крайней мере, на моей машине в версии 7, Shift + Enter оценка побеждает.

Возвращаясь к вашему примеру,

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

Это не работает так, как вы думаете, потому что Dynamic в этом случае не оценивает то, что отображается на экране.

Вы могли бы тривиально продемонстрировать результат, выполнив ...

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

но я предполагаю, что вы были заинтересованы не только в отображении его на экране, но в установке какого-то побочного эффекта. Возможно, вы назначали Select переменной. Есть два способа вызвать эти побочные эффекты. Один - поместить их в второй аргумент Dynamic. Например ...

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

Второй - создать динамический, который действительно отображается на экране, но один что не заметно. Например,

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

В этом случае фактически отображается динамический. Он отображается рядом с Слайдер. Но вы его не видите, потому что он отображает пустую строку. Тем не менее, у него есть все свойства автоматического обновления, которые есть у любого Dynamic.

Для получения дополнительной информации вы должны прочитать начальные и расширенные учебные пособия по Dynamic. в документации Mathematica. Вы также можете увидеть мой пост на comp.soft-sys.math.mathematica здесь (который я частично переформулировал для этого ответа).

31
ответ дан 2 December 2019 в 04:25
поделиться

Думаю, вы хотите убрать из выбора "Динамический". Кажется, это работает, когда я играю с ним:

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

РЕДАКТИРОВАТЬ: Ваш фактический вопрос был «почему это не работает» вместо «как мне заставить это работать». Вот проблема:

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.}}]\)

Итак, если вы скажете «Динамический [1]», вы получите на экране цифру «3», но на самом деле это не «3» - это какой-то элемент записной книжки, который фактически отображает a '3'.

Результатом функции сравнения является выражение, подобное приведенному выше, которое не оценивается как True, поэтому select не принимает никаких элементов, поэтому вы получаете пустой набор.

2
ответ дан 2 December 2019 в 04:25
поделиться

Вы хотите, чтобы все исходное выражение Select было динамическим, потому что вы хотите обновлять выбранное подмножество при изменении значения q . Это можно сделать, переместив Dynamic наружу. Попробуйте следующее:

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

Dynamic[Select[Range[1, 20], # > q &]]
1
ответ дан 2 December 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: