我的第一个简单的调色板应该是:
- 附加我的包路径到
$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
这个词仍然是蓝色的。这将与您在这里报告的问题有关。