2011-04-18 13 views
6

Mathematica proporciona muchas funciones que son capaces de manejar Dynamic como argumento. Por ejemplo, la función FileNameSetter tiene la siguiente variante:Dinámico como argumento de función

FileNameSetter[Dynamic[name]] 
uses the dynamically updated current value of name, with the 
value of name being reset if a different file is chosen. 

Me pregunto cómo uno va sobre la definición de un modelo de función que toma una expresión dinámica como argumento. Por ejemplo, aquí es un intento para envolver la variante dinámica de la función LocatorPane:

SinLocatorPane[Dynamic[sinvalue_]] := 
LocatorPane[Dynamic[x, (x = #; sinvalue = Sin[First[#]]) &], 
      Plot[Sin[x], {x, 0, 10}]] 

Cuál es el patrón correcto para utilizar para un argumento expresión dinámica? ¿Hay alguna advertencia al usar el argumento dinámico dentro de la definición de la función?

+3

Creo que la sección 'Apariencias de control personalizadas' de tutorial/AdvancedManipulateFunctionality sería relevante. No olvide leer también los tres prerrequisitos mencionados en la parte superior de ese tutorial. –

+0

Gracias por proporcionar el enlace al tutorial. – sakra

Respuesta

4

Si desea escribir una función que actualice el valor de una cierta variable, esto es como pasar una variable por referencia. La forma estándar de lograr esto en Mathematica es usar los atributos Hold* en su función.

SetAttributes[SinLocatorPane, HoldFirst]; 
SinLocatorPane[sinvalue_] := 
LocatorPane[Dynamic[x, (x = #; sinvalue = Sin[First[#]]) &], 
    Plot[Sin[x], {x, 0, 10}]] 

Entonces

{Dynamic[sv], SinLocatorPane[sv]} 

funcionaría como su esperado. Su código funcionó porque Dynamic tiene HoldFirst atribuido y esto permitió que su código actualice la variable sinvalue. De lo contrario, Dynamic no era realmente necesario

Cuestiones relacionadas