dynamic - 在 DynamicModule 中打印动态变量

标签 dynamic wolfram-mathematica

为什么在下面的示例中,不是b的值被打印而是符号名称?如何强制打印变量的实际动态值?

a = {1, 2, 3};

DynamicModule[{b},
 Print[Dynamic[b]];
 {Dynamic[a], Dynamic[b]}
 ,
 Initialization :> (b = Length[a]; a = a + 2)
 ]

输出:

b$107

Out[2]= {{3, 4, 5}, 3}

编辑(阅读您的答案/评论后):

考虑更简单的示例,没有 Initialization代码(绕过 WReach 的示例):

a = {1, 2, 3};

DynamicModule[{b = Length[a]},
 Print[Dynamic[b]];
 {Dynamic[a], Dynamic[b]}
 ]

输出:

During evaluation of In[4]:= b$602

Out[5]= {{1, 2, 3}, 3}

请注意,如果我使用 Module,这个示例就会实现我想要的效果而不是DynamicModule或省略Dynamic来自Print线。我的担忧是:

  1. 为什么第二个示例无法正确打印 b 的值?没有初始化,其中(根据帮助)包含“首次显示 DynamicModule 时要计算的表达式”。另根据帮助:“首次评估 DynamicModule 时,首先对局部变量进行初始赋值,然后评估 Initialization 选项的任何设置。”

  2. 帮助应为:“初始化:首次显示 DynamicModule结果时计算的表达式”,这意味着 Print屏幕上的声明并不构成DynamicModule的“结果” 。如果这是正确的,那么(只有那时)我才明白为什么 Print声明并不意味着Dynamic对象正确显示。

最佳答案

我相信发生这种情况是因为调用Print语句时尚未显示Dynamic对象b,因此初始化尚未制作。我记得,动态功能只有在实际、可见地显示后才会运行。

参见Why won't this work? Dynamic in a Select了解更多信息。

<小时/>

根据您的更新,我的理论是,Print 中的Dynamic 语句从未由前端显示,因此它从未实际初始化。也就是说,它仍然是一个唯一的占位符,等待最终显示时由 b 的动态值填充。

从下面的示例中可以看出,分配 RHS 评估发生在正文 Print 之前,至少通过前端中的显示顺序来衡量。此外,我们看到 Print “进入”Dynamic 并获取由 DynamicModule 创建的唯一符号名称,并将其打印出来。我们可以使用 ToString 使 Print 按原样显示整个表达式。同样,如果我们从该字符串中提取符号名称,并将其转换为实际符号,则在打印之前,我们会得到确实已经分配的预期值。

alarm := (Print["Initialized!"]; 3)

DynamicModule[{b = alarm},
  Print @ ToString @ Dynamic @ b;
  Print @ Symbol @ StringTake[ToString@Dynamic@b, {9, -2}];
  Print @ Dynamic @ b;
];

输出:

Initialized!

Dynamic[b$701]

3

b$701 

关于dynamic - 在 DynamicModule 中打印动态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7730863/

相关文章:

javascript - 如何在 Sencha Touch 中添加数据到列表动态

arrays - Pharo 3 中文字数组和动态数组的区别

wolfram-mathematica - 交集或求解

wolfram-mathematica - 如何在评估时删除输入单元格?

java - 用于大输出的 Java 高级文本记录 Pane

excel - 变量范围内最后一个填充单元格的返回值

dynamic - g++ 在动态库中生成错误的符号

wolfram-mathematica - 如何从 Mathematica 7 中的图像表制作动画

wolfram-mathematica - 在mathematica中使用Input[]输入数据

c# - 如何通过上下文菜单控制动态生成的控件的可见性?