# Global vs Private in nb but CDF is working fine.

Posted 5 years ago
5923 Views
|
5 Replies
|
1 Total Likes
|
 Hello, I am new Mathematica user and my duties require me to learn CDF development. For that I have been developing a toy application so I can learn how to create a interactive enterprise cdf. I got several helps in here but there is much I need to learn. Below is the code that I used to create a cdf file for integration. (I am also going to include the CDF file) I use an encoded package. The app is simply taking 1D definite integral. Manipulate[ DynamicModule[{f = Sin[x], xR = 1, xL = 0, Res = 0.459697694131860316}, Column[{Style["1D Definite Integral Calculator", "Function"] logo, Row[{"Lower Limit ", InputField[Dynamic[xL], Number]}, Spacer], Row[{"Upper Limit ", InputField[Dynamic[xR], Number]}, Spacer], Row[{"Function ", InputField[Dynamic[f]]}, Spacer], Button[Style["Calculate", Green, Bold], Dynamic[Res = TF1DINTPackageD1Int[f, xR, xL, np, nw];]], Row[{"Result", InputField[Dynamic[Res], Enabled -> False]}, Spacer], Row[{"Plot the Function ", Checkbox[Dynamic[fp], {False, True}]}], If[fp == True, InputField[ Dynamic[Plot[f, {x, xL, xR}, Dynamic[PlotLabel -> f], ImageSize -> Full]], FieldSize -> {30, 15}]], Button[Mouseover[Style["http://www.wolfram.com", "Hyperlink"], Style["http://www.wolfram.com", "HyperlinkActive"]], NotebookLocate[{URL["http://www.wolfram.com"], None}], Appearance -> None]}]], {{np, 16, "NumberFormat"}, ControlPlacement -> Bottom}, {{nw, 16, "WorkingPrecision"}, ControlPlacement -> Bottom}, Initialization :> (Get[ FileNameJoin[{NotebookDirectory[EvaluationNotebook[]], "TF1DINTPackage.m"}]];)] and the package (before I encode it , encoded version is also attached) BeginPackage["TF1DINTPackage"]; D1Int::usage=""; Begin["Private"]; D1Int[f_,xR_,xL_,np_,nw_]:=Module[{xLcheck,xRcheck},xLcheck=NumberQ[xL]; xRcheck=NumberQ[xR]; If[xLcheck==True&&xRcheck==True,ResultTF=SetPrecision[NIntegrate[f,{x,xL,xR},WorkingPrecision->Re[IntegerPart[nw]]],Re[IntegerPart[np]]],"Enter numeric inputs for Lower and Upper Limits"]]; SetAttributes[D1Int,{ReadProtected,Protected,Locked}]; End[]; EndPackage[]; I keep both the main file and the package in the same folder. The folder is NOT in the path of Mathematica but I think GET command take care of it. I saved this file (via menu) as enterprise CDF and kept the .cdf file with the package in the same folder (same with the .nb file) . While the CDF file is working I am getting error on .nb file. Here is the screen shots of the error  How can avoid this error in the .nb file?Thank you for the help. Attachments: Answer
5 Replies
Sort By:
Posted 5 years ago
 All new(not found) symbols are created in current $Context so MyIntegrate[func_]:= NIntegrate[func,{x,0,1}] Will introduce x in Global context while BeginPackage["MyPackage"]; MyIntegrate::usage=""; Begin["Private"]; MyIntegrate[func_]:=NIntegrate[func,{x,0,1}]; End[]; EndPackage[]; MyIntegrate[Sin[x]]   NIntegrate[Sin[x], {MyPackagePrivatex, 0, 1}]  is creating definition with MyPackagePrivatex. So the function is integrated over different variable. Additionally some subtleties about symbolic preprocessing are giving NIntegrate::inumr: error, which will not occur if variables match.Later, user is providing Sin[x] for example, but this x is created in current $Context which is probable Global again.This is one of reasons why all those built in functions like Plot Integrate etc etc will ask you to provide a variable too, like Integrate[x, {**x**,0,1}]. Answer
Posted 5 years ago
 Thank you for the reply but to be honest I still did not understand why I am the problem. From the main code Sin[x] or let me say f[x] goes as a symbolic variable to the package. There I create a variable x and it is privative because the package is private. I thought creating an x variable in the module should have solved the problem. BeginPackage["TF1DINTPackage"]; D1Int::usage=""; Begin["Private"]; D1Int[f_,xR_,xL_,np_,nw_]:=Module[{xLcheck,xRcheck,x},xLcheck=NumberQ[xL]; xRcheck=NumberQ[xR]; If[xLcheck==True&&xRcheck==True,ResultTF=SetPrecision[NIntegrate[f,{x,xL,xR},WorkingPrecision->Re[IntegerPart[nw]]],Re[IntegerPart[np]]],"Enter numeric inputs for Lower and Upper Limits"]]; SetAttributes[D1Int,{ReadProtected,Protected,Locked}]; End[]; EndPackage[]; but it did not. And I did not understand your solution idea. Answer
Posted 5 years ago
 Try to change your package, using these simple definitions which circumvent the problem Kuba mentioned: oneVarQ = MatchQ[Context /@ DeleteDuplicates@Cases[#, _Symbol, -1], {"Global"}] &; getVar = Cases[#, _Symbol, -1][] &; MyIntegrate[func_?oneVarQ] := NIntegrate[func, Evaluate@{getVar@func, 0, 1}]; Answer
Posted 5 years ago
 I found a weird behavior when I delete the private command from the package and when I first run a Quit command. BeginPackage["TFPackageSourceCode"]; (*WD1Int::usage=""; Begin["Private"];*) WD1Int[f_,xR_,xL_,np_,nw_]:=Module[{xLcheck,xRcheck},xLcheck=NumberQ[xL]; xRcheck=NumberQ[xR]; If[xLcheck==True&&xRcheck==True,ResultTF=SetPrecision[NIntegrate[f,{x,xL,xR},WorkingPrecision->Re[IntegerPart[nw]]],Re[IntegerPart[np]]],"Enter numeric inputs for Lower and Upper Limits"]]; SetAttributes[WD1Int,{ReadProtected,Protected,Locked}]; (*End[];*) EndPackage[]; and with the same main file. Manipulate[ DynamicModule[{f = Sin[x], xR = 1, xL = 0, Res = 0.459697694131860316}, Column[{Style["1D Definite Integral Calculator", "Function"], Row[{"Lower Limit ", InputField[Dynamic[xL], Number]}, Spacer], Row[{"Upper Limit ", InputField[Dynamic[xR], Number]}, Spacer], Row[{"Function ", InputField[Dynamic[f]]}, Spacer], Button[Style["Calculate", Green, Bold], Dynamic[Res = TFPackageSourceCodeWD1Int[f, xR, xL, np, nw];]], Row[{"Result", InputField[Dynamic[Res], Enabled -> False]}, Spacer], Row[{"Plot the Function ", Checkbox[Dynamic[fp], {False, True}]}], If[fp == True, InputField[ Dynamic[Plot[f, {x, xL, xR}, Dynamic[PlotLabel -> f], ImageSize -> Full]], FieldSize -> {30, 15}]], Button[Mouseover[Style["http://www.wolfram.com", "Hyperlink"], Style["http://www.wolfram.com", "HyperlinkActive"]], NotebookLocate[{URL["http://www.wolfram.com"], None}], Appearance -> None]}]], {{np, 16, "NumberFormat"}, ControlPlacement -> Bottom}, {{nw, 16, "WorkingPrecision"}, ControlPlacement -> Bottom}, Initialization :> (Get[ FileNameJoin[{NotebookDirectory[EvaluationNotebook[]], "TFPackageSourceCode.wl"}]];)] Answer
Posted 5 years ago
 I think your questions are valid and important but they are not receiving enough attention due to the fact that you dump here a lot of irrelevant code. It isn't very long yet messy enough for me to stop reading (sorry, don't have unlimited time).So the problem is that x declared in a package is different than used later by the user. Take a look at closely related topic:http://mathematica.stackexchange.com/q/114769/5478If you can't use the first solution go with the second: Integrate[function, Symbol[\$Context <> "x"]] ` Answer