wolfram mathematica - tabla - Mathematica-Separando Cuadernos
graficar tabla de datos en mathematica (3)
No estoy realmente seguro de si esto es algo sabio, pero de todos modos.
Aquí está una solución esquemática para dos cuadernos. Puede ser generalizado, pero no es sencillo.
Abrir dos cuadernos
En cada uno de ellos, vaya al menú (evaluación -> contexto predeterminado de Notebook -> Único a este Notebook) Con esto, los símbolos ya no se comparten.
En cada cuaderno, introduzca algo como
Context[]
para obtener el contexto de cuaderno.Ahora en cada cuaderno ingresa el siguiente código
.
Needs["Experimental`"];
SetAttributes[f, HoldFirst];
f[s_, val_] := ToExpression@StringJoin["Notebook$$17$799580`",
ToString@Unevaluated@s, "=", ToString@val];
ValueFunction[t] = f
Donde el Notebook$$17$799580
es el contexto de EL OTRO Cuaderno (esto debería poder obtenerse "automáticamente", pero esto es solo una prueba de concepto.
Ahora cuando quieras compartir un símbolo ingresa
f[symbolToShare]
Eso es.
Puede compartir el valor de forma bidireccional, o solo en una dirección, ingresando f [x] solo en el Cuaderno que desea como valor de origen para x. El otro Notebook obtendrá el valor actualizado, pero no lo actualizará nuevamente.
HTH!
Editar
Hacia la automatización:
Puede obtener todos los demás Contextos de Notebook abiertos para actualizar sus símbolos compartidos como:
ctxs[]:= Complement[Contexts["Notebook$$*"],
Flatten@Union[{Context[]},
StringCases[Contexts["Notebook$$*"], __ ~~ "Private" ~~ __]]]
Así que tu f se convertirá en algo como esto (no probado)
f[s_, val_] := ToExpression@StringJoin[#,
ToString@Unevaluated@s, "=", ToString@val]&/@ctxs[];
¿Hay alguna forma de separar los cuadernos abiertos de Mathematica para que no compartan ninguna variable? ¿Qué tal si lo hacemos así que algunas variables son compartidas pero no todas?
Para dar a todos los cuadernos contextos únicos, abra el Inspector de opciones y configure Opciones de celda → Opciones de evaluación → Contexto de celda a Notebook
.
Sí hay. Recomiendo leer documentación relacionada con 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á los 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 cuaderno especifica un contexto (almacenado en la variable $Context
) donde se almacenan todas sus variables (a menos que se use el nombre completo).
Por defecto, para todos los cuadernos el contexto es "Global`". También de forma predeterminada, $ ContextPath para todos los portátiles incluye el contexto "Global`" (así como "System`" y algunos otros). El resultado neto es que las variables se comparten en los cuadernos, y esto puede convertirse rápidamente en una molestia. Sin embargo, hay una solución fácil. Para crear un contexto "privado" para un cuaderno, evalúe lo siguiente:
SetOptions[EvaluationNotebook[], CellContext -> Notebook]
A este cuaderno se le asignará un contexto único (evalúe la variable $Context
para ver qué es). Además, el contexto global se eliminará de ContextPath (intente evaluar $ContextPath
antes y después de las SetOptions[...]
anteriores para ver qué está pasando).
[ Actualización : como lo señaló rcollyer en el nuevo intercambio de pila de Mathematica, para establecer esta opción como la predeterminada para los nuevos cuadernos, haga lo siguiente: abra el Inspector de opciones (Ctrl + Shift + O), cambie el alcance (en el menú desplegable la parte superior) de "Selección" a "Preferencias globales"; a la izquierda, expanda las Opciones de celda de nodos -> Opciones de evaluación, y cambie la configuración de CellContext a "Notebook".
Ahora, aquí está cómo crear un contexto compartido:
Begin["SharedContext`"];
varShared1 = "Shared string";
End[];
Alternativamente, podrías haber escrito
SharedContext`varShared1 = "Shared string";
Ahora puede usar los nombres completos ("SharedContext`varShared1" funcionará en cualquier cuaderno), o puede agregar el contexto a $ ContextPath:
AppendTo[$ContextPath, "SharedContext`"]
Si hace esto en todos los cuadernos, varShared1 se hará visible sin un nombre completamente calificado.
Para resumir, el contexto funciona como 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 espera: el contexto existente del símbolo se puede usar en lugar de SharedContext`), por lo que recomiendo una buena dosis de experimentación y lectura detenida de los documentos.