Is there a way to separate open Mathematica notebooks so that they don't share any variables? How about making it so some variables are shared but not all?
相关问题
- Puzzled by Function body evaluation
- how to overload Times and Plus for matrix multipli
- AOSP Build TARGET_PRODUCT fails
- Modifying a Graphics3D object generated by Paramet
- Mathematica “AppendTo” function problem
相关文章
- histogram without vertical lines in Mathematica
- Entering data with Input[] in mathematica
- Using Fold to calculate the result of linear recur
- How should I write a function to be used in Apply
- NMinimize eats all memory b/c of unnecessary symbo
- Mathematica: set default value for argument to non
- how does mathematica determine which rule to use f
- Animate the movement of a point along the plot of
To give all notebooks unique contexts open Options Inspector and set Cell Options → Evaluation Options → Cell Context to
Notebook
.I'm not really sure if this is a wise thing to do, but anyway.
Here is a schematic solution for two Notebooks. It may be generalized, but it's not straightforward.
Open two Notebooks
In each of them go to the menu (evaluation -> Notebook's default context -> Unique to this Notebook) With this, the symbols are not shared anymore.
In each Notebook enter something like
Context[]
to get the Notebook ContextNow in each Notebook enter the following code
.
Where the
Notebook$$17$799580
is the context of THE OTHER Notebook (this should be able to be obtained "automatically", but this is a proof of concept only.Now when you want to share a symbol enter
That's it.
You may share the value bidirectionally, or just in one direction, entering f[x] only in the Notebook you want as source value for x. The other Notebook will get the updated value, but it'll not update it back.
HTH!
Edit
Towards automation:
You may get all other open Notebook Contexts to update your shared symbols as:
So your f will become something like this (not tested)
Yes, there is. I recommend reading documentation related to Mathematica contexts. In a nutshell, all variables belong to some context (namespace), and all variables can be accessed via their fully-qualified names of the form "ContextName`varName". If you just use "varName", Mathematica will search contexts in
$ContextPath
(try evaluating the variable$ContextPath
to see what it is), and will use the first context where it finds that variable. In addition, each notebook specifies a context (stored in the variable$Context
) where all its variables are stored (unless fully-qualified name is used).By default, for all notebooks the context is "Global`". Also by default, $ContextPath for all notebooks includes the "Global`" context (as well as "System`" and some others). The net result is that variables are shared across notebooks, and this can rather quickly become annoying. However, there's an easy solution. To create a "private" context for a notebook, evaluate the following:
This notebook will be assigned a unique context (evaluate the variable
$Context
to see what it is). Also, global context will be removed from ContextPath (try evaluating$ContextPath
before and after theSetOptions[...]
above to see what's going on.)[Update: As pointed out by rcollyer on the new Mathematica stack exchange, to set this option as the default for new notebooks, do the following: open the Options Inspector (Ctrl+Shift+O), change the scope (in the dropdown on the top) from "Selection" to "Global Preferences"; on the left expand the nodes Cell Options -> Evaluation Options, and change the CellContext setting to "Notebook."]
Now, here's how to create a shared context:
Alternatively, you could've just typed
Now you can either use the fully qualified names ("SharedContext`varShared1" will work in any notebook), or you can add the context to $ContextPath:
If you do this in all notebooks, varShared1 will become visible without a fully-qualified name.
To summarize, context work a lot like many other search paths. However, there are many subtleties (for example, if a symbol has already been defined in some other context, the Begin["SharedContext`"]/End[] block might not work as you expect -- the existing context of the symbol will be used instead of SharedContext`), so I recommend a healthy dose of experimentation and perusing the docs.