2011-09-23 21 views
7

¿Alguna idea de cómo hacer que esto funcione?Evaluar [] parece no funcionar dentro del botón []

y = {}; Table[Button[x, AppendTo[y, Evaluate[x]]], {x, 5}] 

Resultado: Haga clic en [1], haga clic en [2], obtener {6,6}

estoy trivializar la tarea actual, pero el objetivo es establecer lo que hace un botón dentro de un Map o una o TableParallelTable.

Por favor ayuda!


EDITAR
lo descubrió ... Evaluate obras en sólo el primer nivel. Aquí, es muy profundo. Así que utilicé ReplaceRule:

Remove[sub]; y = {}; Table[Button[x, AppendTo[y, sub]] /. sub -> x, {x, 5}] 
+2

Por favor, envíe 'Eliminar [sub]; y = {}; Tabla [ Botón [x, AppendTo [y, sub]] /. sub -> x, {x, 5}] 'como respuesta –

Respuesta

5

de repuesto y funciones puras ofrecen alternativas concisas a With. Por ejemplo:

y={}; Range[5] /. x_Integer :> Button[x, AppendTo[y, x]] 

o

y = {}; Replace[Range[5], x_ :> Button[x, AppendTo[y, x]], {1}] 

o

y = {}; Array[Button[#, AppendTo[y, #]] &, {5}] 

o

y = {}; Button[#, AppendTo[y, #]] & /@ Range[5] 

Para otro ejemplo comparando estas técnicas, ver mi post here, donde se aplican a un problema Lem de crear una lista de funciones puras con parámetros incrustados en su cuerpo (cierres).

10

Este es un trabajo para With. With se utiliza para insertar una expresión evaluada en otra expresión a cualquier profundidad - incluso en partes de la expresión que no son evaluados de inmediato como el segundo argumento de Button:

y = {}; Table[With[{x = i}, Button[x, AppendTo[y, x]]], {i, 5}] 

En casos sencillos como este, algunas personas (incluido yo) prefieren utilizar el mismo símbolo (x en este caso), tanto para las variables With y Table, por lo tanto: reglas

y = {}; Table[With[{x = x}, Button[x, AppendTo[y, x]]], {x, 5}] 
+1

+1. Es tangencial a la discusión actual, pero en la parte inferior de mi publicación en este hilo: http://groups.google.com/group/comp.soft-sys.math.mathematica/browse_thread/thread/b07d6ff89313c70d, definí una macro, que, cuando se envuelve alrededor de 'Con [...]', lo obliga a inyectar expresiones no evaluadas en su cuerpo. Lo menciono aquí porque pensé que podría encontrarlo interesante. –

+1

+1 Para explicar el constructo de scoping en sus propias palabras (y no en las de WRI, que no son lo suficientemente claras) –

0

Evaluate funciona en el primer nivel solamente. Aquí, es muy profundo. Así que utilicé ReplaceRule:

Remove[sub]; y = {}; Table[ Button[x, AppendTo[y, sub]] /. sub -> x, {x, 5}] 
Cuestiones relacionadas