2011-02-04 8 views

Respuesta

35

Sí, hay. Recomiendo leer la documentación relacionada con los contextos de Mathematica. En pocas palabras, todas las variables pertenecen a algún contexto (espacio de nombres), y se puede acceder a todas las variables a través de sus nombres completos del formulario "ContextName`varName". Si solo usa "varName", Mathematica buscará contextos en $ContextPath (intente evaluar la variable $ContextPath para ver cuál es), y usará el primer contexto donde encuentre esa variable. Además, cada computadora portátil especifica un contexto (almacenado en la variable $Context) donde se almacenan todas sus variables (a menos que se use el nombre completo).

De manera predeterminada, para todos los portátiles, el contexto es "Global`". También por defecto, $ ContextPath para todos los portátiles incluye el contexto "Global" (así como "Sistema" y algunos otros). El resultado neto es que las variables se comparten entre los portátiles, y esto puede convertirse rápidamente en algo molesto. Sin embargo, hay una solución fácil. Para crear un contexto "privado" para un portátil, evaluar lo siguiente:

SetOptions[EvaluationNotebook[], CellContext -> Notebook] 

Este portátil se le asignará un contexto único (evaluar la variable $Context para ver lo que es). Además, el contexto mundial será retirado de ContextPath (intenta evaluar $ContextPath antes y después de la SetOptions[...] arriba para ver lo que está pasando.)

[actualización: Como ha señalado rcollyer en el nuevo cambio de pila Mathematica, para establecer este Como opción predeterminada para los nuevos portátiles, haga lo siguiente: abra el Inspector de opciones (Ctrl + Shift + O), cambie el alcance (en el menú desplegable en la parte superior) de "Selección" a "Preferencias globales"; a la izquierda ampliar las opciones de los nodos de la célula -> Opciones de evaluación, y cambie la configuración a CellContext]

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

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

Alternativamente, usted podría' he acaba de escribir

SharedContext`varShared1 = "Shared string"; 

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

AppendTo[$ContextPath, "SharedContext`"] 

Si haces esto en todos los portátiles, varShared1 se hará visible sin un nombre completo.

En resumen, el contexto funciona de forma muy similar a muchas otras rutas de búsqueda. Sin embargo, hay muchas sutilezas (por ejemplo, si un símbolo ya se ha definido en algún otro contexto, el bloque Begin ["SharedContext`"]/End [] podría no funcionar como esperaba, el contexto existente del símbolo ser utilizado en lugar de SharedContext`), por lo que recomiendo una buena dosis de experimentación y leer detenidamente los documentos.

+0

Sí. Mucho mejor que el mío Eliminando –

+6

También puede configurar esto a través del menú Contexto predeterminado de evaluación> Notebook (en lugar de SetOptions). [La documentación utiliza la configuración "Único a cada grupo de celdas" para que no haya conflictos de variables.] –

+1

Pregunta de seguimiento: ¿hay de todos modos para hacer que Mathematica establezca el contexto de los nuevos cuadernos para que sean privados por defecto, en lugar de tener que crear un contexto privado para cada nuevo portátil de forma manual? – Joe

1

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

Aquí es una solución esquemático para dos cuadernos. Puede ser generalizado, pero no es sencillo.

  1. Abra dos cuadernos

  2. En cada uno de ellos van al menú (evaluación -> default contexto de Notebook -> La particularidad de este Cuaderno) Con esto, los símbolos no se comparten más.

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

  4. Ahora en cada Notebook introducir el código de siguiente

.

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

    f[s_, val_] := [email protected]["Notebook$$17$799580`", 
        [email protected]@s, "=", [email protected]]; 

    ValueFunction[t] = f 

Cuando el Notebook$$17$799580 es el contexto del otro portátil (esto debería ser capaz de obtener "automáticamente", pero esto es una prueba de concepto único.

Ahora, cuando usted quiere compartir un símbolo introducir

f[symbolToShare] 

Eso es todo.

es posible compartir el valor de forma bidireccional, o simplemente en una dirección, entrando f [x] sólo en el portátil y quieres como valor fuente para x. El otro Notebook obtendrá el valor actualizado, pero no lo actualizará.

HTH!

Editar

hacia la automatización:

Usted puede obtener todos los demás contextos cuaderno abierto para actualizar sus símbolos compartidos como:

ctxs[]:= Complement[Contexts["Notebook$$*"], 
        [email protected][{Context[]}, 
        StringCases[Contexts["Notebook$$*"], __ ~~ "Private" ~~ __]]] 

Así que su f se convertirán en algo como esto (no probado)

f[s_, val_] := [email protected][#, 
        [email protected]@s, "=", [email protected]]&/@ctxs[]; 
0

para dar a todos los cuadernos contextos únicos abierta opciones del inspector y establecer Opciones de celdaOpciones de evaluacióncontexto de celda a Notebook.