Я сейчас путешествую. Я проверю через две недели.

SaveDefinitionsший вариантManipulate, Это вызываетManipulate хранить любые определения, использованные для его создания, внутри панели «Манипуляции». Созданный таким образом Манипулятор может быть скопирован в пустой блокнот и все равно будет работать самостоятельно. Кроме того, ваша рабочая тетрадь, содержащая множество таких манипуляций, также не превращается в розовую шкатулку с напечатанными сообщениями об ошибках под ней при открытии. Большой!

Тем не менее, все это добро имеет свою темную сторону, которая может сильно укусить вас, если вы не знаете об этом. У меня было это в блокноте, над которым я работал несколько дней, но я представляю вам пошаговый пример сценария с игрушкой, который воссоздает проблему.

В этом сценарии вы хотите создатьManipulate показывает график хорошей волнистой функции, поэтому вы определяете это (пожалуйста, сделайте размер окна следующим, это важно):

Определение хорошее, поэтому мы оставим его в следующий раз и сделаем его ячейкой инициализации. Далее мы добавимManipulateи выполнить его тоже.

f[x_] := x^2

Manipulate[
 Plot[n f[x], {x, -3, 3}],
 {n, 1, 4},
 SaveDefinitions -> True
 ]

Все отлично работает, Манипулятор действительно светит, это хороший день.

Просто будучи вашим параноиком, вы проверяете правильность определения:

Да, все еще проверяется. Хорошо. Но теперь вам приходит в голову, что лучшая волнистая функция была бы синусом, поэтому вы меняете определение, выполняете и, будучи параноиком, проверяете:

Все по-прежнему хорошо. Вы готовы после тяжелого рабочего дня, вы сохраняете свою работу и уходите. [Выйти из ядра]

На следующий день. Вы начинаете свою работу снова. Вы оцениваете ячейки инициализации в своей записной книжке. Определение все еще хорошо? Проверьте.

Теперь вы прокрутите вниз до окна «Манипулировать» (нет необходимости повторного выполнения благодаряSaveDefinitions), поиграйте немного с ползунком. И прокрутите назад.

Будучи параноиком, вы еще раз проверяете определение f:

И вот, кто-то изменил определение за вашей спиной! И ничего не выполняется между вашим первым и вторымInformation(?) проверить по номерам In [] (In[1]: def of f,In[2] первый ?,In[3] второй?).

Что случилось? Ну, этоManipulate конечно.FullForm раскрывает свою внутреннюю структуру:

Manipulate[Plot[n*f[x],{x, -3, 3}],{{n, 2.44}, 1, 4},Initialization:>{f[x_] := x^2}]

Там у вас есть виновник. Часть инициализации блока снова определяет f, но это старая версия, потому что мы не переоценивалиManipulate после изменения его определения. Как только окно манипуляции появляется на экране, оно оценивается, и вы возвращаете свое старое определение. Во всем мире!

Конечно, в этом игрушечном примере сразу видно, что происходит что-то странное. В моем случае у меня был большой модуль в большом ноутбуке, в котором я после небольшой отладки изменил небольшую часть. Казалось, что это сработало, но на следующий день тот же баг, который меня подвел, прежде чем снова ударил. Мне потребовалось несколько часов, прежде чем я понял, что этим занимается один из нескольких Манипуляторов, которые я использовал для изучения проблемы со всех сторон.

Очевидно, я испытываю желание сказать, что это нежелательное поведение. Теперь по обязательному вопросу:что мы можем сделать, чтобы предотвратить это поведение за вашей спинойManipulate от возникновения, кроме повторного выполнения каждогоManipulate в вашей записной книжке каждый раз, когда вы меняете определение, которое они могут использовать?

Ответы на вопрос(2)

Ваш ответ на вопрос