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
Post a Comment