Создание надежных мониторов в реальном времени для переменных - PullRequest
7 голосов
/ 06 января 2012

Мы можем создать монитор в реальном времени для такой переменной:

CreatePalette@Panel@Row[{"x = ", Dynamic[x]}]

(Это более интересно и полезно, если x окажется чем-то вроде $Assumptions. Это так простоустановите значение и затем забудьте об этом.)

К сожалению, это перестает работать, если ядро ​​перезапускается (Quit[], затем что-то оцените).Палитра больше не будет отображать изменения значения x.

Есть ли способ сделать это, чтобы он продолжал работать даже в сеансах ядра?Я часто перезагружаю ядро.(Если полученная палитра приводит к автоматическому запуску ядра после Quit, это нормально.)


Обновление: Как упоминалось в комментариях, получается, что палитра прекращаетсяработает, только если мы выйдем, оценив Quit[].При использовании Evaluation -> Quit Kernel -> Local он будет продолжать работать.


Ответы [ 2 ]

3 голосов
/ 11 января 2012

@ ответ Халирутана сотряс мою память ...

Вы когда-нибудь сталкивались: Experimental/ref/ValueFunction? (адрес документации)

Несмотря на то, что в документации нет примеров, в разделе «дополнительная информация» приведена следующая информация:

Назначение ValueFunction[symb] = f указывает, что всякий раз, когда symb получает новое значение val, выражение f[symb,val] должно быть оценены.

3 голосов
/ 06 января 2012

Я могу только догадываться, потому что на моем Ubuntu ситуации здесь кажутся ошибочными. Трюк с выходом из меню, как предположил Леонид, не сработал. Еще один: на свежем сеансе Mathematica с открытой только одной записной книжкой:

Dynamic[x]
x = 1
Dynamic[x]
x = 2

дает, как и ожидалось

2
1
2
2

Набрав в следующей строке Quit, оценив и набрав затем, x=3 обновляет только первый из Динамических [x].

Тем не менее, вы проверили команду

Internal`GetTrackedSymbols[]

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

Я думал, что у меня что-то подобное с

Internal`SetValueTrackExtra 

но в настоящее время я не могу воспроизвести поведение.

...