Skip to main content

Retrieving the evaluation result of an Initialization Cell in a notebook `nb1` from another notebook `nb2`



I have a very long code in a notebook nb1 in which all the initialization cells are tagged. I have another notebook nb2 where I want to evaluate the initialization cells in nb1 and get the results in nb2 by using CellTags.


I tried the following code, which does something but I cannot see the results in nb2.


myButton[tag_] := 
Button["Evaluate " <> tag,
NotebookEvaluate[
"C:\\Users\\ttemel\\Desktop\\World_Bank_projects\\WB_Contract_2\\\
Extension_to_1st_contract_27oct19\\IOdatabase_oecd\\database_IOtables_\
SA_NO_UK_2000_2015_run_1.m", EvaluationElements -> {"Tags" -> {tag}}],
Method -> "Queued"];
Grid[{Map[myButton, {"SectorIOMarketChains", "DensityPlot"}]}]

CellPrint[
ExpressionCell[Defer[Print["SectorIOMarketChains"]], "Input",
CellTags -> {"SectorIOMarketChains"}, ShowCellTags -> True]]
CellPrint[
ExpressionCell[Defer[Print["DensityPlot"]], "Input",
CellTags -> {"DensityPlot"}, ShowCellTags -> True]]

Why does not this code give me the results in nb2?



Answer



Your file "database_IOtables _SA _NO _UK _ 2000_ 2015_run _ 1.m" isn't a Notebook, but a Package - right? Hence the EvaluationElements option is simply ignored, because Packages has no Cells and associated CellTags.



Obviously, you are trying to adapt the code from the section Examples ► Applications on the Documentation page for NotebookEvaluate.


Here is how it is supposed to work:




  1. Create a Notebook with your cells:


    nb = CreateDocument[{
    ExpressionCell[Defer[Print["SectorIOMarketChains"]], "Input",
    CellTags -> {"SectorIOMarketChains"}, ShowCellTags -> True],
    ExpressionCell[Defer[Print["DensityPlot"]], "Input", CellTags -> {"DensityPlot"},
    ShowCellTags -> True]

    }];


  2. In current Notebook create Buttons for evaluating tagged cells from that Notebook:


    myButton[nb_, tag_] := 
    Button["Evaluate " <> tag,
    NotebookEvaluate[nb, EvaluationElements -> {"Tags" -> {tag}}], Method -> "Queued"];
    Grid[{Map[myButton[nb, #] &, {"SectorIOMarketChains", "DensityPlot"}]}]



    screenshot





  3. Sequentially press the buttons, the results will appear in current Notebook:



    screenshot






When working with an existing Notebook, on the first step you should use NotebookOpen (possibly with the option Visible -> False if you don't want it to be displayed):


nb = NotebookOpen[filePath, Visible -> False];

Do not forget to close the invisible Notebook when it is no longer needed:


NotebookClose[nb]

You can get the list of currently opened Notebooks (including invisible) via Notebooks:


Notebooks[]




Note that NotebookEvaluate is a relatively old function, introduced when CellObject wasn't available. Similar (but not exactly the same) effect can be achieved with Cells and ToExpression:


ToExpression[NotebookRead[Cells[nb, CellTags -> {"SectorIOMarketChains"}]][[1, 1]]]


SectorIOMarketChains



You can see what ToExpression returns using its three-argument form:


ToExpression[
NotebookRead[Cells[nb, CellTags -> {"SectorIOMarketChains"}]][[1, 1]], StandardForm, Hold]



Hold[Print["SectorIOMarketChains"]]

Comments

Popular posts from this blog

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1....