评估[]似乎无法在Button []内部工作

Gre*_*per 7 wolfram-mathematica mathematica-8

知道如何让这个工作吗?

y = {}; Table[Button[x, AppendTo[y, Evaluate[x]]], {x, 5}]
Run Code Online (Sandbox Code Playgroud)

结果:单击[ 1],单击[ 2],获取{6,6}

我轻视实际的任务,但我们的目标是建立一个内部的按钮做什么MapTableParallelTable.

请帮忙!


编辑想
出来...... Evaluate只在第一级工作.在这里,它太深了.所以我用过ReplaceRule:

Remove[sub]; y = {}; Table[Button[x, AppendTo[y, sub]] /. sub -> x, {x, 5}]
Run Code Online (Sandbox Code Playgroud)

WRe*_*ach 10

这是一份工作With. With用于将计算表达式插入到任何深度的另一个表达式中 - 甚至是表达式中未立即计算的部分,如第二个参数Button:

y = {}; Table[With[{x = i}, Button[x, AppendTo[y, x]]], {i, 5}]
Run Code Online (Sandbox Code Playgroud)

在这种简单的情况下,有些人(包括我自己)更愿意为和变量使用相同的符号(x在本例中),因此:WithTable

y = {}; Table[With[{x = x}, Button[x, AppendTo[y, x]]], {x, 5}]
Run Code Online (Sandbox Code Playgroud)


Leo*_*rin 5

替换规则和纯函数提供了简洁的替代方案With.例如:

y={}; Range[5] /. x_Integer :> Button[x, AppendTo[y, x]]
Run Code Online (Sandbox Code Playgroud)

要么

y = {}; Replace[Range[5], x_ :> Button[x, AppendTo[y, x]], {1}]
Run Code Online (Sandbox Code Playgroud)

要么

y = {}; Array[Button[#, AppendTo[y, #]] &, {5}]
Run Code Online (Sandbox Code Playgroud)

要么

y = {}; Button[#, AppendTo[y, #]] & /@ Range[5]
Run Code Online (Sandbox Code Playgroud)

有关比较这些技术的另一个示例,请参阅此处的帖子,其中它们适用于创建嵌入在其主体(闭包)中的参数的纯函数列表的问题.