3 votes

Comment sauvegarder des définitions sans utiliser la structure Manipuler ?

Je réalise un document CDF dans lequel je place des pièces dynamiques au milieu du texte. Ce document est censé fonctionner dans le Player.

Quelle est la meilleure façon d'enregistrer des valeurs globales auxquelles il faut accéder à partir de toutes les pièces dynamiques dispersées dans différentes cellules ?

Par exemple, je veux définir g=9.8, et je veux que cette valeur soit accessible à toutes les dynamiques placées dans les différentes cellules. Puisque cela doit fonctionner sur le lecteur, cette valeur doit persister à travers les sessions de Mathematica.

Je n'ai trouvé que deux façons de procéder :

  • un bouton d'action sur lequel l'utilisateur doit cliquer lorsqu'il ouvre le fichier et qui lance tous les = et := nécessaires utilisés dans le carnet de notes.
  • créer un manipulateur vide, avec un SaveDefinitions->True, et dont les variables ne sont pas localisées dans le Manipulateur

Les deux semblent trop artificiels.

Toute autre méthode qui ne définit les définitions qu'une fois la dynamique affichée n'est pas bonne, car la personne qui accepte d'afficher la dynamique peut avoir déjà défilé vers le bas et être passée par la dynamique qui met en œuvre toutes les définitions nécessaires.

Alors, comment "sauver les définitions" sans utiliser la structure Manipuler ?

2voto

Alexey Popkov Points 5498

Une possibilité consiste à définir des Initialization pour chaque Dynamic dans le document et placer les expressions d'initialisation dans une cellule d'initialisation (ou dans une autre cellule avec une étiquette qui permet de l'identifier facilement). Par exemple, en utilisant la cellule d'initialisation :

Manipulate[
 Plot[n f[x], {x, -3, 3}], {n, 1, 4}, 
 Initialization :> If[!TrueQ[$initialized],
                      FrontEndTokenExecute["EvaluateInitialization"]]]

De cette manière, il n'est pas nécessaire de stocker des expressions d'initialisation dans chaque Dynamic et ces expressions ne seront pas évaluées de manière répétée pour chacun d'entre eux.


Mise à jour

Il semble que NotebookDynamicExpression L'option de l'ordinateur portable est ce que vous voulez. John Fultz a écrit à ce sujet :

" Dynamic peuvent être stockées dans les options frontales CellDynamicExpression , NotebookDynamicExpression et FrontEndDynamicExpression . Ceux-ci Dynamic ne sont pas affichés, mais sont mis à jour lorsque la cellule/le carnet/le frontend auquel ils sont attachés est affiché".

La solution est donc la suivante :

SetOptions[EvaluationNotebook[], NotebookDynamicExpression :> (a = 1)]

Essayez de sauvegarder et d'ouvrir à nouveau le cahier après avoir évalué ce qui précède. Et vérifiez la définition de a .

0voto

Nasser Points 5977

Je n'ai pas essayé de le faire dans un document dynamique comme vous l'avez fait, mais vous pouvez le faire :

"En utilisant des cellules d'initialisation, vous pouvez spécifier que certaines cellules d'entrée d'un carnet doivent être évaluées en premier. Cela permet de s'assurer que votre code est évalué dans le bon ordre, par exemple en définissant des fonctions avant d'évaluer les cellules qui utilisent ces définitions."

http://reference.wolfram.com/mathematica/howto/WorkWithInitializationCells.html

0voto

Chris Degnen Points 3237

Vous pouvez utiliser quelque chose de ce type :

DynamicModule[{savetext = ""},
 Dynamic[If[StringQ[string], savetext = string, savetext],
  Initialization :> (string = savetext)]]

Lors de la première évaluation string n'existe pas, de sorte que StringQ a pour effet d'afficher "" dans Dynamic. Par la suite, StringQ s'évalue à True, et Dynamic affiche le texte dans string . savetext est sauvegardée d'une session à l'autre en tant que variable locale de DynamicModule.

string peut être mis à jour directement, par exemple string = "new text"

Toutefois, si plus d'une copie de cette construction est ouverte en même temps, l'une d'entre elles sera ouverte en même temps. string mettra à jour l'autre.

Il serait intéressant de voir des suggestions sur la façon dont les instances pourraient être isolées (sans renommer "string").

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X