Re: Using package functions in Manipulate/DynamicModule
- To: mathgroup at smc.vnet.net
- Subject: [mg109212] Re: Using package functions in Manipulate/DynamicModule
- From: Rui <rui.rojo at gmail.com>
- Date: Sat, 17 Apr 2010 06:04:24 -0400 (EDT)
- References: <hq0mqd$k0u$1@smc.vnet.net> <hq3a3s$nca$1@smc.vnet.net>
On Apr 13, 11:43 pm, Hannes Kessler <HannesKess... at hushmail.com> wrote: > On 13 Apr., 05:01, Rui <rui.r... at gmail.com> wrote: > > > > > Hey. My objective is to deploy in a Mathematica Player file a document > > which has some interactive stuff, without any code visible. Ideally, > > it would be all in a single file but I can live with sending a .m > > package file too. So far so good. > > > Inside a DynamicModule I used some functions from a .m file I had > > created some time ago. As expected, when I close the file and reopen > > it, the dynamic gives errors everywhere. > > > First I thought there might be something magical similar to > > SaveDefinitions that would automatically store in the cell everything > > it needs to work fine. But I coulnd't find it. I tried wrapping it up > > in a Manipulate with SaveDefinitons->True but doesn't work either. > > > So, I decided to try for the cell to just load the package whenever it > > needs to be displayed for the first time. > > "Initialization:>Needs["AddOns'"]" seemed to be perfect. However, it > > doesn't work as expected. > > For example: (SS and IListPlot are from AddOns.m) > > Manipulate[ > > IListPlot[SS[p, 100] @@ Range[100]], {p, 1, 100, 1}, > > Initialization -> Needs["AddOns`"], SaveDefinitions -> True] > > doesn't work and tells me there are double definitions in Global` and > > AddOns` of IListPlot and SS (right after starting the kernel) > > > The few times I've tried to use "Initialization" it gave me a > > headache. I would have thought it just executes that whenever the > > dynamicmodule/manipulate is displayed for the first time, but evidence > > proves it isn't that simple, and I don't get it. > > > Perhaps I should put all of my package's variables in the > > DynamicModule and copy the whole package inside? > > When something that strikes me as useful and common is getting > > convoluted and messy, it's a sign I'm overseing something and needing > > your help. > > > Thanks a lot! ;D > > Try the following: > > Needs["AddOns`"]; > DynamicModule[{p}, > Column[{ > Slider[Dynamic[p], {1, 100, 1}] , > Dynamic @ IListPlot[SS[p, 100] @@ Range[100]] > }], > Initialization :> AbortProtect[Needs["AddOns`"]]] > > The first Needs makes sure the package is loaded when the > DynamicModule is created. > The second Needs initializes the package after quitting Mathematica > and re-opening the notebook. > It is important to use a RuleDelayed and not a Rule: Initialization -> > Needs["AddOns`"] loads the output of Needs["AddOns`"] generated when > the DynamicModule is created. This output is Null. Thus the package > would not be loaded when the notebook is re-opened after quitting > Mathematica. > AbortProtect prevents time out errors in case the package needs a > longer time to load. > > Best regards, > Hannes Kessler Very helpful. I was definately needing the AbortProtect tobreak through my frustration on the issue