动态作为函数参数

sak*_*kra 6 wolfram-mathematica

Mathematica提供了许多能够Dynamic作为参数处理的函数.例如,函数FileNameSetter具有以下变体:

FileNameSetter[Dynamic[name]] 
 uses the dynamically updated current value of name, with the 
 value of name being reset if a different file is chosen.
Run Code Online (Sandbox Code Playgroud)

我想知道如何定义一个以动态表达式作为参数的函数模式.例如,这里是一次尝试包装LocatorPane函数的动态变量:

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

用于动态表达式参数的正确模式是什么?在函数定义中使用动态参数是否有任何警告?

Sas*_*sha 4

如果您想编写一个函数来更新某个变量的值,这就像通过引用传递变量一样。Hold*在 Mathematica 中实现此目的的标准方法是在函数上使用属性。

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

然后

{Dynamic[sv], SinLocatorPane[sv]}
Run Code Online (Sandbox Code Playgroud)

会按你的预期工作。您的代码有效,因为 Dynamic 已HoldFirst归因,这允许您的代码更新 variable sinvalue。否则,动态并不是真正需要的