Wolfram mathematica Mathematica-分离笔记本

Wolfram mathematica Mathematica-分离笔记本,wolfram-mathematica,Wolfram Mathematica,有没有办法将打开的Mathematica笔记本分开,这样它们就不会共享任何变量?让一些变量共享,而不是全部共享怎么样?我不确定这样做是否明智,但无论如何 这是两台笔记本电脑的示意图解决方案。它可能是广义的,但并不简单 打开两本笔记本 在每一个菜单中,进入菜单 (评估->笔记本的默认设置 上下文->此笔记本独有) 这样,符号就不再共享了 在每个笔记本中输入一些内容 如Context[]获取笔记本 上下文 现在在每个笔记本中输入 以下代码 其中,笔记本$$17$799580是另一个笔记本的上下文(

有没有办法将打开的Mathematica笔记本分开,这样它们就不会共享任何变量?让一些变量共享,而不是全部共享怎么样?

我不确定这样做是否明智,但无论如何

这是两台笔记本电脑的示意图解决方案。它可能是广义的,但并不简单

  • 打开两本笔记本

  • 在每一个菜单中,进入菜单 (评估->笔记本的默认设置 上下文->此笔记本独有) 这样,符号就不再共享了

  • 在每个笔记本中输入一些内容 如
    Context[]
    获取笔记本 上下文

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

  • 其中,
    笔记本$$17$799580
    是另一个笔记本的上下文(应该能够“自动”获取),但这只是概念证明

    现在,如果要共享符号,请输入

     f[symbolToShare]  
    
    就这样

    您可以双向共享该值,也可以仅在一个方向共享该值,只在您想要的笔记本中输入f[x]作为x的源值。另一个笔记本将获得更新后的值,但不会将其更新回来

    编辑

    走向自动化:

    您可以获取所有其他打开的笔记本上下文来更新共享符号,如下所示:

    ctxs[]:= Complement[Contexts["Notebook$$*"], 
                      Flatten@Union[{Context[]}, 
                      StringCases[Contexts["Notebook$$*"], __ ~~ "Private" ~~ __]]]
    
    所以你的f会变成这样(未测试)


    是的,有。我建议阅读与Mathematica上下文相关的文档。简而言之,所有变量都属于某个上下文(名称空间),所有变量都可以通过“ContextName`varName”形式的完全限定名进行访问。如果只使用“varName”,Mathematica将在
    $ContextPath
    (尝试评估变量
    $ContextPath
    以查看它是什么),并将使用找到该变量的第一个上下文。此外,每个笔记本指定一个上下文(存储在变量
    $context
    中),其中存储其所有变量(除非使用完全限定名)

    默认情况下,所有笔记本电脑的上下文都是“全局”。同样,默认情况下,所有笔记本电脑的$ContextPath都包括“全局”上下文(以及“系统”和其他一些上下文)。最终结果是,变量在笔记本电脑之间共享,这很快就会变得烦人。不过,有一个简单的解决方案。创建“私有”上下文对于笔记本,请评估以下内容:

    SetOptions[EvaluationNotebook[], CellContext -> Notebook]
    
    此笔记本将被分配一个唯一的上下文(评估变量
    $context
    以查看它是什么)。此外,全局上下文将从ContextPath中删除(尝试在上面的
    设置选项[…]之前和之后评估
    $ContextPath
    ,以查看发生了什么。)

    [更新:正如rcollyer在新Mathematica stack exchange上指出的,要将此选项设置为新笔记本电脑的默认选项,请执行以下操作:打开选项检查器(Ctrl+Shift+O),将范围(在顶部的下拉列表中)从“选择”更改为“全局首选项”;在左侧展开节点单元选项->计算选项,并将单元上下文设置更改为“笔记本”。]

    现在,以下是如何创建共享上下文:

    Begin["SharedContext`"];
    varShared1 = "Shared string";
    End[];
    
    或者,你也可以直接打字

    SharedContext`varShared1 = "Shared string";
    
    现在,您可以使用完全限定名称(“SharedContext`varShared1”在任何笔记本中都可以使用),也可以将上下文添加到$ContextPath:

    AppendTo[$ContextPath, "SharedContext`"]
    
    如果在所有笔记本电脑中都这样做,则varShared1将在没有完全限定名称的情况下可见


    总而言之,上下文的工作方式与许多其他搜索路径非常相似。但是,有许多细微之处(例如,如果符号已在其他上下文中定义,则Begin[“SharedContext`]”/End[]块可能无法按预期工作--将使用符号的现有上下文而不是SharedContext`),因此我建议进行健康的实验并仔细阅读文档。

    为所有笔记本电脑提供独特的上下文开放选项检查器和设置
    单元选项→ 评价选择→ 将单元格上下文设置为
    笔记本

    是的。比我的要好得多。删除。您也可以通过评估>笔记本的默认上下文菜单(而不是设置选项)进行设置。[文档使用“每个单元格组唯一”设置,因此没有任何变量冲突。]后续问题:是否有办法让Mathematica在默认情况下将新笔记本的上下文设置为私有上下文,而不必手动为每个新笔记本创建私有上下文?@Joe:据我所知不是这样,但我编写了一些方便的函数来轻松设置和访问私有上下文。我只需键入
    setPrivate[]
    当我开始一个新的笔记本时,以及
    sprownscratch[]
    当我想在另一个笔记本中复制现有笔记本的上下文时。我已经使用了一年多,发现它非常方便。代码如下:@LeoAlekseyev:终于有人找到了让Mathematica将新笔记本的上下文默认设置为私有的方法:签出
    SharedContext`varShared1 = "Shared string";
    
    AppendTo[$ContextPath, "SharedContext`"]