有没有办法将开放的Mathematica笔记本分开,以便它们不共享任何变量?如何让一些变量共享但不是全部?
答案 0 :(得分:36)
是的,有。我建议阅读与Mathematica上下文相关的文档。简而言之,所有变量都属于某个上下文(命名空间),并且所有变量都可以通过其形式为“ContextName`varName”的完全限定名称来访问。如果您只使用“varName”,Mathematica将搜索$ContextPath
中的上下文(尝试评估变量$ContextPath
以查看它是什么),并将使用它找到该变量的第一个上下文。此外,每个笔记本指定一个上下文(存储在变量$Context
中),其中存储了所有变量(除非使用了完全限定的名称)。
默认情况下,对于所有笔记本,上下文为“全局”。此外,默认情况下,所有笔记本的$ ContextPath都包含“Global`”上下文(以及“System`”和其他一些内容)。最终结果是变量在笔记本电脑之间共享,这很快就会变得很烦人。但是,有一个简单的解决方案。要为笔记本创建“私有”上下文,请评估以下内容:
SetOptions[EvaluationNotebook[], CellContext -> Notebook]
将为此笔记本分配一个唯一的上下文(评估变量$Context
以查看它是什么)。此外,全局上下文将从ContextPath中删除(尝试在上面$ContextPath
之前和之后评估SetOptions[...]
以查看正在发生的事情。)
[更新:正如rcollyer在新的Mathematica堆栈交换中所指出的,要将此选项设置为新笔记本的默认选项,请执行以下操作:打开选项检查器(Ctrl + Shift + O ),将范围(在顶部的下拉列表中)从“选择”更改为“全局首选项”;在左侧展开节点单元格选项 - >评估选项,并将CellContext设置更改为“Notebook。”]
现在,以下是创建共享上下文的方法:
Begin["SharedContext`"];
varShared1 = "Shared string";
End[];
或者,你可以只输入
SharedContext`varShared1 = "Shared string";
现在您可以使用完全限定名称(“SharedContext`varShared1”可以在任何笔记本中使用),或者您可以将上下文添加到$ ContextPath:
AppendTo[$ContextPath, "SharedContext`"]
如果在所有笔记本中执行此操作,varShared1将在没有完全限定名称的情况下可见。
总而言之,上下文工作与许多其他搜索路径很相似。但是,有许多细微之处(例如,如果在某些其他上下文中已经定义了符号,则Begin [“SharedContext`”] / End []块可能无法正常工作 - 符号的现有上下文将使用而不是SharedContext`),所以我建议进行健康的实验并仔细阅读文档。
答案 1 :(得分:1)
我不确定这是否是明智之举,但无论如何。
这是两个笔记本的示意解决方案。它可能是概括的,但并不简单。
打开两本笔记本
在每个菜单中进入菜单 (评估 - >笔记本电脑的默认值 上下文 - >这款笔记本独有) 这样,符号就不再共享了。
在每个笔记本中输入内容
像Context[]
一样得到笔记本
上下文
现在在每个笔记本中输入 以下代码
。
Needs["Experimental`"];
SetAttributes[f, HoldFirst];
f[s_, val_] := ToExpression@StringJoin["Notebook$$17$799580`",
ToString@Unevaluated@s, "=", ToString@val];
ValueFunction[t] = f
Notebook$$17$799580
是其他笔记本的上下文(这应该能够“自动”获得,但这只是概念证明。
现在,当您要共享符号时,请输入
f[symbolToShare]
就是这样。
您可以双向共享该值,或仅在一个方向上共享该值,仅在您想要的笔记本中输入f [x]作为x的源值。另一个Notebook将获得更新的值,但它不会更新它。
HTH!
修改
迈向自动化:
您可以将所有其他打开的笔记本上下文更新为:
ctxs[]:= Complement[Contexts["Notebook$$*"],
Flatten@Union[{Context[]},
StringCases[Contexts["Notebook$$*"], __ ~~ "Private" ~~ __]]]
所以你的f会变成这样(未经测试)
f[s_, val_] := ToExpression@StringJoin[#,
ToString@Unevaluated@s, "=", ToString@val]&/@ctxs[];
答案 2 :(得分:0)
要为所有笔记本提供独特的上下文,请打开选项检查器并进行设置
单元格选项→评估选项→单元格上下文到Notebook
。