Subscribe Bookmark RSS Feed

Dialog and column formula scripting problems

tpinck27

Community Trekker

Joined:

Jan 13, 2016

I am working on scripting a repetitive analysis process. Part of this process will require the user to input a series of weights for different samples. To do this I want to use a dialog window since the weights change every time we run the process.

For example lets say I have the following data set (Image on the right). I need to the standardize my Y measurements to the sample weights that the user inputs. So I wrote the following script to get the weights from the user and unload the values from the dialog box. Now I want to create a new column where the value in Y is divided by the appropriate sample weight. So I want the first six columns (Sample A1) to all be divided by the weight A1 from the dialog window but I am stuck trying to figure out how to script this. I'm fairly new to scripting so suggestions would be really helpful.

12858_pastedImage_6.png

dlg = Dialog(

"Enter Sample Weights",    

Lineup( 1,

"A1",

a1 = edit number( 12 ),

"A2",

a2 = edit number( 12 ),

"B1",

b1 = edit number( 12 ),

"B2",

b2 = edit number( 12 ),

"C1",

c1 = edit number( 12 ),

"C2",

c2 = edit number( 12 ),

Button( "OK" ),

Button( "Cancel" )

;

a1 = dlg["a1"];

a2 = dlg["a2"];

b1 = dlg["b1"];

b2 = dlg["b2"];

c1 = dlg["c1"];

c2 = dlg["c2"];


1 ACCEPTED SOLUTION

Accepted Solutions
Solution

This should do the trick.  I'm using New Window instead of Dialog, as Phil suggested.  Rather than a column formula I'm simply looping over the table rows.  If you need a formula let us know.

dt = New Table( "Sample Weights", Add Rows( 7 ),

     New Column( "Sample", Character, "Nominal",

           Set Values( {"A1", "A1", "A2", "B1", "B2", "C1", "C2"} )

     ),

     New Column( "Y", Numeric, "Continuous", Format( "Best", 12 ),

           Set Values( [1.3, 3.2321, 1.005, 3.2321, 4.1221, 2.931, 1.32] )

     )

);

nw = New Window("Sample Weights", << modal(),

     panelbox("Enter Sample Weights",

           lineup box(ncol(2),

                textbox("A1"), a1_neb = numbereditbox(12),

                textbox("A2"), a2_neb = numbereditbox(12),

                textbox("B1"), b1_neb = numbereditbox(12),

                textbox("B2"), b2_neb = numbereditbox(12),

                textbox("C1"), c1_neb = numbereditbox(12),

                textbox("C2"), c2_neb = numbereditbox(12),

           ),

     ),

     panelbox("Actions",

           hlistbox(

                button box("OK",

                     keep_going = 1;

                     a1 = a1_neb << get;

                     a2 = a1_neb << get;

                     b1 = a1_neb << get;

                     b2 = a1_neb << get;

                     c1 = a1_neb << get;

                     c2 = a1_neb << get;

                ),

                button box("Cancel", keep_going = 0;),

           ),

     )

);

dt << new column("Y Div", numeric, continuous);

// EDIT: Forgot to use the keep going flag

if (keep_going,

// Create a new column with the dialog box results

     for (i = 1, i <= nrows(dt), i++,

           one_sample = dt:sample[i];

           if (one_sample == "A1", dt:ydiv[i] = dt:y[i] / a1;,

                one_sample == "A2", dt:ydiv[i] = dt:y[i] / a2;,

                one_sample == "B1", dt:ydiv[i] = dt:y[i] / b1;,

                one_sample == "B2", dt:ydiv[i] = dt:y[i] / b2;,

                one_sample == "C1", dt:ydiv[i] = dt:y[i] / c1;,

                one_sample == "C2", dt:ydiv[i] = dt:y[i] / c2;

           )

     );

);

4 REPLIES
Phil_Brown

Super User

Joined:

Mar 20, 2012

tpinck27

What version of JMP are you using? Dialog has been deprecated for some time now. I would suggest using New Window() instead of Dialog and NumberEditBox()​ instead of EditNumber.

PDB
tpinck27

Community Trekker

Joined:

Jan 13, 2016

Thanks for the suggestion. I have JMP 12.1, but I was working out of the Jump into JMP scripting book, which is a bit dated.

Solution

This should do the trick.  I'm using New Window instead of Dialog, as Phil suggested.  Rather than a column formula I'm simply looping over the table rows.  If you need a formula let us know.

dt = New Table( "Sample Weights", Add Rows( 7 ),

     New Column( "Sample", Character, "Nominal",

           Set Values( {"A1", "A1", "A2", "B1", "B2", "C1", "C2"} )

     ),

     New Column( "Y", Numeric, "Continuous", Format( "Best", 12 ),

           Set Values( [1.3, 3.2321, 1.005, 3.2321, 4.1221, 2.931, 1.32] )

     )

);

nw = New Window("Sample Weights", << modal(),

     panelbox("Enter Sample Weights",

           lineup box(ncol(2),

                textbox("A1"), a1_neb = numbereditbox(12),

                textbox("A2"), a2_neb = numbereditbox(12),

                textbox("B1"), b1_neb = numbereditbox(12),

                textbox("B2"), b2_neb = numbereditbox(12),

                textbox("C1"), c1_neb = numbereditbox(12),

                textbox("C2"), c2_neb = numbereditbox(12),

           ),

     ),

     panelbox("Actions",

           hlistbox(

                button box("OK",

                     keep_going = 1;

                     a1 = a1_neb << get;

                     a2 = a1_neb << get;

                     b1 = a1_neb << get;

                     b2 = a1_neb << get;

                     c1 = a1_neb << get;

                     c2 = a1_neb << get;

                ),

                button box("Cancel", keep_going = 0;),

           ),

     )

);

dt << new column("Y Div", numeric, continuous);

// EDIT: Forgot to use the keep going flag

if (keep_going,

// Create a new column with the dialog box results

     for (i = 1, i <= nrows(dt), i++,

           one_sample = dt:sample[i];

           if (one_sample == "A1", dt:ydiv[i] = dt:y[i] / a1;,

                one_sample == "A2", dt:ydiv[i] = dt:y[i] / a2;,

                one_sample == "B1", dt:ydiv[i] = dt:y[i] / b1;,

                one_sample == "B2", dt:ydiv[i] = dt:y[i] / b2;,

                one_sample == "C1", dt:ydiv[i] = dt:y[i] / c1;,

                one_sample == "C2", dt:ydiv[i] = dt:y[i] / c2;

           )

     );

);

tpinck27

Community Trekker

Joined:

Jan 13, 2016

Perfect, this is exactly what I needed. Thanks so much.