Re: how to drop ContextPath when printing from a package?
- To: mathgroup at smc.vnet.net
- Subject: [mg116409] Re: how to drop ContextPath when printing from a package?
- From: Albert Retey <awnl at gmx-topmail.de>
- Date: Sun, 13 Feb 2011 05:51:05 -0500 (EST)
- References: <200812020542.AAA19141@smc.vnet.net> <ij2uks$7j8$1@smc.vnet.net>
Hi, > I have a module, which make use of FindFit[data,model,par,x] and > returns the model and a plot of data and the fit curve. I want to use > the model as a PlotLabel but > instead of > > y=1.19623+1048.91 x^0.733809 > > I get > > y=1.19623+1048.91 initData`Private`x$^0.733809 > > How can I get rid of the ContextPath initData`Private`? If it is just the PlotLabel that is a problem for you, I would suggest to replace the symbol with a string. If you are also returning the model, that will also contain the symbol in your private context, which is not very useful as a result. I see two ways to solve that: 1) return the model in form of a Function, which localizes the independent variable of the model. 2) let the caller provide the symbol to be used as independent variable of the model. Both have their pros and cons: case 2 is probably more consistent with what Mathematica internal functions usually do and probably best fits the use within a notebook, case 1 is something that a programmer using the function might prefer since it has less implications concerning unwanted evaluations of the independent variables (consider what the myFit or FindFit will do when you supply a variable which has a value...). So personally I would probably use 2 if the function is meant to be used directly by users of your package, but prefer 1 if I mailny would make use of the package in other code. Here are examples based on Sjoerds example function: Case 1): replace x with a string for the plot label, return a function (note that I would suggest to use Block instead of Module in this case to not create a new symbol for each Function to be returned): BeginPackage["myFit`"]; myFit::"usage" = "myFit[data] makes a fit."; Begin["`Private`"]; myFit[data_] := Block[{x, a, b, f, model, plot}, f = FindFit[data, a + b x, {a, b}, x]; model = a + b x /. f; plot = ListPlot[data, PlotLabel -> (model /. x -> "x")]; {Function @@ {{x}, model}, plot} ]; End[]; EndPackage[]; Case 2): replace x with a string for the plot label, return an expression built with a symbol defined by the caller: BeginPackage["myFit`"]; myFit::"usage" = "myFit[data,var] makes a fit."; Begin["`Private`"]; myFit[data_, x_Symbol] := Module[{f, a, b, model, plot}, f = FindFit[data, a + b x, {a, b}, x]; model = a + b x /. f; plot = ListPlot[data, PlotLabel -> (model /. x :> SymbolName[x])]; {model, plot} ]; End[]; EndPackage[]; hth, albert