26 votos

Mathematica - La Separación De Los Cuadernos

Es allí una manera de separar abrir los cuadernos de Mathematica para que no comparten ninguna de las variables? Cómo acerca de lo que es por lo que algunas variables son compartidos, pero no todos?

36voto

Leo Alekseyev Puntos 3794

Sí, los hay. Recomiendo la lectura de la documentación relacionada con Mathematica contextos. En pocas palabras, todas las variables que pertenecen a algún contexto (espacio de nombres), y todas las variables se puede acceder a través de su completo los nombres de la forma "ContextName'varName". Si usted sólo tiene que utilizar "varName", Mathematica buscará en contextos en $ContextPath (trate de la evaluación de la variable $ContextPath a ver lo que es), y vamos a utilizar el primer contexto donde se encuentra que la variable. Además, cada notebook especifica de un contexto (almacenado en la variable $Context) donde todas sus variables se almacenan (a menos nombre completo es utilizado).

Por defecto, para todos los portátiles es el contexto "Global`". También por defecto, $ContextPath para todos los portátiles incluye el "Global`" contexto (así como "Sistema", y algunos otros). El resultado neto es que las variables son compartidos a través de los cuadernos, y esto puede rápidamente llegar a ser molesto. Sin embargo, hay una solución fácil. Para crear un "privado" en el contexto de un notebook, evaluar las siguientes:

SetOptions[EvaluationNotebook[], CellContext -> Notebook]

Este cuaderno será asignado un único contexto (evaluar la variable $Context a ver de qué se trata). También, el contexto global será eliminado de ContextPath (tratar de evaluar $ContextPath antes y después de la SetOptions[...] de arriba para ver lo que está pasando.)

[Actualización: Como se ha señalado por rcollyer en el nuevo Mathematica de intercambio de la pila, para establecer esta opción como predeterminada para los nuevos cuadernos, hacer lo siguiente: abrir las Opciones del Inspector (Ctrl+Shift+O), cambiar el alcance (en el desplegable de la parte superior) de "Selección" a "Preferencias Globales"; en la izquierda, expanda los nodos de la Célula Opciones -> Opciones de Evaluación, y cambiar el CellContext configuración de "Cuaderno".]

Ahora, aquí es cómo crear un contexto compartido:

Begin["SharedContext`"];
varShared1 = "Shared string";
End[];

Alternativamente, usted podría haber escrito solo

SharedContext`varShared1 = "Shared string";

Ahora usted puede utilizar los nombres completos ("SharedContext'varShared1" funcionará en cualquier notebook), o puede agregar el contexto de $ContextPath:

AppendTo[$ContextPath, "SharedContext`"]

Si se puede hacer esto en todos los portátiles, varShared1 será visible sin un nombre totalmente calificado.

Para resumir, el contexto de trabajo mucho al igual que muchos otros caminos de búsqueda. Sin embargo, hay muchas sutilezas (por ejemplo, si un símbolo ya ha sido definido en otro contexto, el comienzo["SharedContext`"]/[] bloque podría no funcionar como se espera -- el contexto del símbolo se utiliza en lugar de SharedContext`), así que os recomiendo una buena dosis de experimentación y hojeando los documentos.

1voto

belisarius Puntos 45827

No estoy realmente seguro de si esto es una cosa sabia que hacer, pero de todos modos.

Aquí es un esquema de la solución de dos Cuadernos. Puede ser generalizada, pero no es sencillo.

  1. Abrir dos Cuadernos

  2. En cada uno de ellos vaya al menú (evaluación -> Portátil del defecto contexto -> Única para este Notebook) Con esto, los símbolos no son compartidos más.

  3. En cada Cuaderno escriba algo como Context[] para obtener el Notebook Contexto

  4. Ahora en cada Cuaderno de entrar en el código siguiente

.

   Needs["Experimental`"];  
   SetAttributes[f, HoldFirst];  

   f[s_, val_] := ToExpression@StringJoin["Notebook$$17$799580`", 
                   ToString@Unevaluated@s, "=", ToString@val];

   ValueFunction[t] = f

Donde la Notebook$$17$799580 es el contexto de LA OTRA Notebook (este debe ser capaz de obtenerse "automáticamente", pero esto es una prueba de concepto único.

Ahora, cuando quieres compartir un símbolo de entrar

 f[symbolToShare]  

Eso es todo.

Usted puede compartir el valor de forma bidireccional, o sólo en una dirección, entrando en f[x] sólo en el Portátil que queremos como fuente de valor para x. El otro Portátil obtener el valor actualizado, pero no va a actualizar de nuevo.

HTH!

Editar

Hacia la automatización:

Usted puede obtener todas las demás Notebook Contextos para la actualización de su compartido de símbolos como:

ctxs[]:= Complement[Contexts["Notebook$$*"], 
                  Flatten@Union[{Context[]}, 
                  StringCases[Contexts["Notebook$$*"], __ ~~ "Private" ~~ __]]]

Por lo que su f se convierta en algo como esto (no probado)

   f[s_, val_] := ToExpression@StringJoin[#, 
                   ToString@Unevaluated@s, "=", ToString@val]&/@ctxs[];

0voto

robodork Puntos 1

Para dar a todos los blocs de notas único contextos abrir las Opciones del Inspector y el conjunto de Celular OpcionesOpciones de EvaluaciónContexto de Células a Notebook.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X