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

functions - Get leading series expansion term?

Given a function f[x] , I would like to have a function leadingSeries that returns just the leading term in the series around x=0 . For example: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x)] x and leadingSeries[(1/x + 2 + (1 - 1/x^3)/4)/(4 + x)] -(1/(16 x^3)) Is there such a function in Mathematica? Or maybe one can implement it efficiently? EDIT I finally went with the following implementation, based on Carl Woll 's answer: lds[ex_,x_]:=( (ex/.x->(x+O[x]^2))/.SeriesData[U_,Z_,L_List,Mi_,Ma_,De_]:>SeriesData[U,Z,{L[[1]]},Mi,Mi+1,De]//Quiet//Normal) The advantage is, that this one also properly works with functions whose leading term is a constant: lds[Exp[x],x] 1 Answer Update 1 Updated to eliminate SeriesData and to not return additional terms Perhaps you could use: leadingSeries[expr_, x_] := Normal[expr /. x->(x+O[x]^2) /. a_List :> Take[a, 1]] Then for your examples: leadingSeries[(1/x + 2)/(4 + 1/x^2 + x), x] leadingSeries[Exp[x], x] leadingSeries[(1/x + 2 + (1 - 1/x...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...