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

Wolfram mathematica 从调色板操作获取包时出现阴影问题,wolfram-mathematica,Wolfram Mathematica,我的第一个简单调色板是: 将我的包路径附加到$Path ActionMenu[“test”,{“简单包路径”:>AppendTo[$Path,ToFileName[{NotebookDirectory[],“02简单包”}]}] 拿我的包裹 ActionMenu[“加载包”,{“获取我的包”:>Get[“myPackage`]}] 在选定的输入单元格(或新的输入单元格)上放置一个给定的输入表达式,其中包含不同的占位符 OpenerView[{“我的包”,按钮[“构造”,粘贴[Stan

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

  • 将我的包路径附加到
    $Path
ActionMenu[“test”,{“简单包路径”:>AppendTo[$Path,ToFileName[{NotebookDirectory[],“02简单包”}]}]

  • 拿我的包裹
ActionMenu[“加载包”,{“获取我的包”:>Get[“myPackage`]}]

  • 在选定的输入单元格(或新的输入单元格)上放置一个给定的输入表达式,其中包含不同的占位符
OpenerView[{“我的包”,按钮[“构造”,粘贴[StandardForm@Defer@构造[占位符[“说明”]、占位符[“另一说明”]]]}]

问题是,当我点击“获取我的包”操作菜单项时,我总是收到“影子”消息。我肯定我不是故意把包裹装两次。当我点击“构造”时,它会写
Global`construct[“description”,“other description”]
。但是我确信在得到包之前我没有定义它(我在测试中杀死了内核)

你知道怎么了吗

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


另外:你知道一种更简单的粘贴
的方法吗[StandardForm@Defer...
确保粘贴的表达式不会被计算,并且即使没有选择单元格,它也会进入输入单元格?

好吧,我没有你的程序包,所以为了进行测试,我更改了操作菜单以获得方差分析程序包:

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

ANOVA[{{1,1},{1,2},{2,4},{2,3}]
现在工作顺利。没有关于阴影的投诉。这表明阴影问题的原因在其他地方。不过,我注意到,
ANOVA
一词保持蓝色。这将与您报告的问题有关。

好的,您的问题似乎是由于解析和接口c之间的相互作用造成的创建。在这种情况下,您希望将接口构造代码(按钮操作函数中使用的包符号)中包符号的解析从接口创建时间延迟到“按下按钮”时间(假设此时已加载包)。以下是一种方法:

Column[{ActionMenu["Load Packages",
   {"Get my package" :> Get["ANOVA`"]}],
   OpenerView[{"ANOVA", Button["construct",
       With[{sym = Symbol["ANOVA"]},
         Paste[StandardForm@Defer@sym[Placeholder["DATA"]]]]]}]}]
我们在这里所做的是使用
将符号注入按钮功能的代码中。但是,在解析界面代码时,我们阻止创建具有此名称的
全局
符号-否则会发生这种情况,这就是导致问题的原因

编辑

如果您确定只使用包中的符号(函数),而不使用
Global'
上下文中的符号(函数),那么下面是一个“受保护”的版本从这个问题来看:如果生成的符号的上下文是“全局”,它将
删除该符号,因此在加载包之前按下按钮只会产生一条警告消息(我使用符号
将消息附加到-应替换为界面制作功能的名称):


我更正了括号中的一些错误,可能是由于复制粘贴造成的。Get语句中有一个'而不是'。我也更改了它。这可能是你的问题的一部分吗?不。事实上,我在复制粘贴方面有问题,并且用“代码”格式显示文本。抱歉,代码有点不一致(实际上它是一个代码包,中间有更多的东西,有项目、样式等)…[加载包],{“获取我的包”:>(get [ [ ANOVA <代码> ] ];块[nb},nb= CREATODCOOPTION[表达式单元]延迟[ to[表达式] [ ANOVA < /代码> *】] ],“输入”],可见->假;SelectionMove[nb,All,Notebook];SelectionEvaluate[nb];NotebookDelete[nb];])}]请尝试以下操作:列[{ActionMenu[“加载包”,{“获取我的包”:>获取[“方差分析”]}],打开视图[{“方差分析”,按钮[“构造”,粘贴[StandardForm@Defer@方差分析[占位符[“数据”]]}]]@P.Fonseca这会给我一条阴影信息。粘贴按钮会粘贴全局“方差分析[占位符]这是错误的上下文。这正是我的问题。Leonid answer解决了它。谢谢。这个问题似乎也很相关:。特别是,在我的帖子中,我演示了使用
Symbol
将解析延迟到运行时的相同技巧。理解了解决方案。非常感谢。我不理解的是解析接口需要在全局上下文中定义符号。在我按下按钮之前,接口不应该处理其中的代码,为什么它需要在全局上下文中包含所有尚未处理的符号?@P.Fonseca这是解析阶段和求值阶段的区别。您在前面输入的代码结束时,始终在求值之前对其进行分析。您的代码
列[…]
确实进行了求值-并在求值之前进行了分析。但是,它的某些部分,特别是按钮处理程序的代码,在接口创建期间不进行求值(这是通过
按钮的
HoldRest
属性实现的)但是,该代码仍然会被解析,并且由于符号创建是解析过程的一部分,并且在
$ContextPath
上还不存在具有此名称的符号,因此会创建一个
全局
符号。@P.Fonseca为了进一步解释,每个解析的符号都必须属于某个上下文,并且如果符号在解析时不存在在
$ContextPath
上的某些包中,它是在当前工作上下文中创建的(
“Global”
)。使用
符号是将符号解析从解析时延迟到运行时的一种方法。由于我们在按钮处理程序代码中使用它,因此在按下按钮之前它不会计算。并且
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"]]]]]]}]}]