动态作为函数参数

时间:2011-04-18 18:01:25

标签: 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.

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

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

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

1 个答案:

答案 0 :(得分:4)

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

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

然后

{Dynamic[sv], SinLocatorPane[sv]}

将按预期工作。您的代码有效,因为Dynamic已归因HoldFirst,这使您的代码可以更新变量sinvalue。否则动态不是真的需要