SaveDefinitions considerado perigoso

SaveDefinitions é uma boa opção deManipulate. CausaManipulate para armazenar todas as definições usadas para sua criação dentro do painel Manipular. Um Manipulado feito dessa maneira pode ser copiado para um caderno vazio e ainda funcionará por si próprio. Além disso, seu caderno de trabalho contendo muitos desses Manipulados também não se transforma em uma enxurrada de caixas cor-de-rosa com mensagens de erro impressas abaixo na abertura. Ótimo

No entanto, toda essa bondade tem seu lado sombrio, que pode te morder muito se você não estiver ciente disso. Eu tenho isso em um caderno no qual trabalho há alguns dias, mas apresento a você um cenário de exemplo de brinquedo passo a passo que recria o problema.

Neste cenário, você deseja criar umManipulate mostrando um gráfico de uma boa função ondulada, então você define isso (por favor, faça um tamanho de janela como este, isso é importante):

A definição é boa, então a mantemos na próxima vez e a tornamos uma célula de inicialização. Em seguida, adicionamos oManipulate e execute-o també

f[x_] := x^2

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

Tudo funciona muito bem, o Manipulate realmente brilha, é um bom dia.

Só sendo seu paranóico, verifique se a definição está correta:

Sim, tudo ainda dá certo. Bem. Mas agora lhe ocorre que uma função ondulada melhor seria um seno; portanto, você muda a definição, executa e é paranóico, verifique:

Tudo ainda está bem. Você está pronto do trabalho duro de um dia para salvar seu trabalho e sair. [Sair do kernel]

Próximo dia. Você começa seu trabalho novamente. Você avalia as células de inicialização no seu notebook. Definição ainda é boa? Verifica

Agora, você desce até a caixa Manipular (não é necessário executar novamente, graças àSaveDefinitions), brinque um pouco com o controle deslizante. E role de volta.

Sendo o paranóico, você mais uma vez verifica a definição de f:

Lo e eis que alguém mudou a definição nas suas costas! E nada executado entre o primeiro e o segundoInformation (?) verifique de acordo com os números de entrada [] In[1]: def de f,In[2] primeiro ?,In[3] segundo?).

O que aconteceu? Bem, é oManipulate claro. UMAFullForm revela sua estrutura interna:

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

Lá você tem o culpado. A parte de inicialização da caixa define f novamente, mas é a versão antiga porque não reavaliamos oManipulate depois de modificar sua definição. Assim que a caixa de manipulação aparecer na tela, ela é avaliada e você recupera sua antiga definição. Globalmente!

Certamente, neste exemplo de brinquedo, é imediatamente claro que algo estranho está acontecendo. No meu caso, eu tinha um módulo maior em um bloco de anotações maior, no qual eu, após alguma depuração, havia trocado uma pequena parte. Pareceu funcionar, mas no dia seguinte, o mesmo bug que havia me incomodado antes de ser atingido novamente. Levei algumas horas para perceber que um dos vários Manipulados que eu costumava estudar o problema em questão por todos os lados estava fazendo isso.

Claramente, estou tentado a dizer que esse é um comportamento indesejado. Agora, para a pergunta obrigatória: o que podemos fazer para evitar esse comportamento por trás das costas deManipulate ocorra diferente de reexecutar todos osManipulate no seu notebook sempre que alterar uma definição que possa ser usada por eles?

questionAnswers(2)

yourAnswerToTheQuestion