从调色板操作获取包时出现阴影问题



我的第一个简单的调色板应该是:

  • 附加我的包路径到$Path

ActionMenu["test",{"The Simple Packages Path":> AppendTo[$Path, ToFileName[{NotebookDirectory[], "02 Simple Packages"}]]}]

  • Get my packages

ActionMenu["Load Packages", {"Get my package":> Get["myPackage`"]}]

  • 在选定的输入单元格(或新的输入单元格)上放置一个给定的输入表达式,包含不同的占位符。

OpenerView[{"my Package", Button["construct", Paste[StandardForm@Defer@construct[Placeholder["description"],Placeholder["another description"]]]]}]

问题是,当我点击"获取我的包"操作菜单项时,我一直得到"影子"消息。而且我肯定我不是故意把包裹装了两遍。当我点击"construct"时,它写的是Global`construct["description","another description"]。但是我确定我没有在获得包之前定义它(我在测试中杀死了内核)。

你知道怎么了吗?

(我在包上使用Get,而不是Needs,以确保包上下文的干净启动)

也:你知道一个更简单的方法做Paste[StandardForm@Defer...,确保表达式粘贴不评估,它进入一个输入单元格,即使没有选择单元格?

好的,看来您的问题是由于解析和接口创建之间的相互作用。在这种情况下,您想要的是将接口构造代码中包符号的解析(在按钮动作函数中使用的包符号)从接口创建时间延迟到"按下按钮"时间(假设到那时,包已经加载)。下面是一种方法:

Column[{ActionMenu["Load Packages",
   {"Get my package" :> Get["ANOVA`"]}],
   OpenerView[{"ANOVA", Button["construct",
       With[{sym = Symbol["ANOVA"]},
         Paste[StandardForm@Defer@sym[Placeholder["DATA"]]]]]}]}]

我们在这里做的是使用With将符号注入到按钮函数的代码中。但是,在解析您的接口代码时,我们阻止使用此名称创建Global符号-这就是否则会发生的情况,这就是导致您的问题的原因。

编辑

如果你确定你只使用符号(功能)包,而不是从Global'上下文,这是一个版本,将"保护"这个问题:它将Remove生成的符号,如果它的上下文是Global'——因此前按下按钮包一直在加载会只是一个警告消息(我使用了符号package附加消息——应该取而代之的是无论你的接口——使函数的名称):

package::noload = "Please load the package containing symbol `1`";
Column[{ActionMenu["Load Packages",
  {"Get my package" :> Get["ANOVA`"]}],
   OpenerView[{"ANOVA", Button["construct",
      With[{sym = Symbol["ANOVA"]},
        If[Context[sym] === "Global`",
          Message[package::noload, Style[ToString[sym], Red]];
          Remove[sym];,
          (* else *)
          Paste[StandardForm@Defer@sym[Placeholder["DATA"]]]]]]}]}]

嗯,我没有你的包,所以为了测试,我更改了操作菜单以获得ANOVA包:

ActionMenu["Load Packages", {"Get my package" :> Get["ANOVA`"]}]

ANOVA[{{1, 1}, {1, 2}, {2, 4}, {2, 3}}]现在可以正常工作了。不要抱怨影子。这表明你的阴影问题的原因在别的地方。不过,我注意到ANOVA这个词仍然是蓝色的。这将与您在这里报告的问题有关。

最新更新