Skip to main content

manipulate - Trouble understanding TrackedSymbols


While developing a relatively complex demonstration for Manipulate I encountered the problem that my output was unintentionally self-updating in an endless loop.


After some digging I discovered the problem is probably related with the following minimal code:


date = DateObject[{2014, 12, 31, 0, 0, 0}];
Dynamic[GeoGraphics[NightHemisphere[date], GeoRange -> "World"],
SynchronousUpdating -> False]

Because the date is fixed I honestly cannot see any reason why this is self-updating in an infinte loop.


First question. Why this happens?



To stop this behavior we can modify the code as:


date = DateObject[{2014, 12, 31, 0, 0, 0}];
Dynamic[GeoGraphics[NightHemisphere[date], GeoRange -> "World"],
TrackedSymbols :> {date}, SynchronousUpdating -> False]

In the real case things are more complex because I have to explicitly list and keep updated a list of many symbols. Things are more complex also because with nested Dynamic the following code doesn't prevent the self-updating:


date = DateObject[{2014, 12, 31, 0, 0, 0}];
Dynamic[{
date, Dynamic[
GeoGraphics[NightHemisphere[date], GeoRange -> "World"],

TrackedSymbols :> Automatic, SynchronousUpdating -> False]
}, TrackedSymbols :> {date}, SynchronousUpdating -> False]

I read many time the advanced documentation of Manipulate and Dynamic, and my understanding was the inner Dynamic should inherits TrackedSymbols from the outer Dynamic.


Second question. Is that true?


Of course this is safe:


date = DateObject[{2014, 12, 31, 0, 0, 0}];
Dynamic[{
date, Dynamic[
GeoGraphics[NightHemisphere[date], GeoRange -> "World"],

TrackedSymbols :> {date}, SynchronousUpdating -> False]
}, TrackedSymbols :> {date}, SynchronousUpdating -> False]

but again very complex to apply in the real case when there are many symbols.


Third question. There is a simpler way to prevent this behavior?




Hello,


Thank you for your email.


I have filed a bug report for the issue of NightHemisphere triggering updates with the development team.



The issue about TrackedSymbols->Automatic is not complete clear from the documentation: if you would like to let the inner Dynamic content inherits the tracked symbols of the enclosing constructs, you can use Refresh:


For example, the following code


Dynamic[{x, Refresh[{x, y}, TrackedSymbols -> Automatic]},
TrackedSymbols -> {x}]


will only update when x is changed.


Setting the tracked symbols correctly is a little tricky -- if the issue with NightHemisphere is causing great difficulty in your code, could you please send us the notebook and maybe the developer might provide some suggestion?


I hope this helps.


Thank you very much for giving us feedback and hopefully this issue would be improved in future release.


Sincerely, Wolfram Technical Support





GeoGraphics[{NightHemisphere@DateObject[{2015, 3, 21}]}] // InputForm


GeoGraphics[Graphics[{}]]





Comments

Popular posts from this blog

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1....