Mathematica - 分离笔记本

时间:2011-02-04 08:39:57

标签: wolfram-mathematica

有没有办法将开放的Mathematica笔记本分开,以便它们不共享任何变量?如何让一些变量共享但不是全部?

3 个答案:

答案 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)

我不确定这是否是明智之举,但无论如何。

这是两个笔记本的示意解决方案。它可能是概括的,但并不简单。

  1. 打开两本笔记本

  2. 在每个菜单中进入菜单 (评估 - >笔记本电脑的默认值 上下文 - >这款笔记本独有) 这样,符号就不再共享了。

  3. 在每个笔记本中输入内容 像Context[]一样得到笔记本 上下文

  4. 现在在每个笔记本中输入 以下代码

  5.    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