我的第一个简单调色板应该是:
将我的包路径附加到$Path的
ActionMenu["test",{"The Simple Packages Path":> AppendTo[$Path, ToFileName[{NotebookDirectory[], "02 Simple 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...的一种更简单的方法吗?它既确保不对正在粘贴的表达式进行计算,也确保它进入输入单元格,即使没有选择单元格?
发布于 2011-08-11 14:50:23
好的,您的问题似乎是由于解析和接口创建之间的相互作用。在这种情况下,您想要的是延迟解析接口中的包符号--构造代码(在按钮操作函数中使用的包符号),从界面创建时间到“按下按钮”时间(假设到那时,包已经加载)。有一种方法可以做到:
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'上下文的符号(函数),那么这里有一个版本将被“保护”不受此问题的影响:如果生成的符号的上下文是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"]]]]]]}]}]发布于 2011-08-11 13:01:21
嗯,我没有你的包,所以为了测试,我改变了动作菜单,得到了ANOVA软件包:
ActionMenu["Load Packages", {"Get my package" :> Get["ANOVA`"]}]ANOVA[{{1, 1}, {1, 2}, {2, 4}, {2, 3}}]现在可以正常工作了。没有关于阴影的抱怨。这表明,你的阴影问题的原因在其他地方。不过,我注意到,ANOVA这个词仍然是蓝色的。这将与您报告的here问题有关。
https://stackoverflow.com/questions/7025084
复制相似问题