cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Check out the JMP® Marketplace featured Capability Explorer add-in
Choose Language Hide Translation Bar
Voizingu
Level III

Using Expr() and Eval() with variables name inside a loop

Hello,

 

I am trying to plot distributions with a loop based on the following criteria:

- need to plot only columns with at least 1x spec limit (LSL or USL)

- need to split by arguments form a selected column (SplitBy)

 

I used Eval(EvalExpr()) to build the expression that I need, but I am struggling with the Where() function to split by the selected column.

 

I extracted the part of the code that is failing and added a dummy table creation at the beginning so the issue can be replicated.

 

there are 3 options of my trials that can be commented/uncommented to replicate the issue in the code below.

My goal is to build an expression that properly calls for the variable "SplitBy" in the Where() like in Option 1 below (but ":CONFIG1" is hardcoded in Option 1)

my attempts Option 2 and 3 (among others...) are failing (log extracts below)

 

Option 1:
dis = dt << Distribution(Continuous Distribution(Column("LogNormal 10,1"n)), Where(:CONFIG1 == “1"))

Option 2:
dis = dt << Distribution(Continuous Distribution(Column("LogNormal 10,1"n)), Where(Column("CONFIG1") == "1"))
This Where-clause for data table 'tabletest.jmp' resulted in no rows: Column( "CONFIG1" ) == "1"

Option 3:
dis = dt << Distribution(Continuous Distribution(Column("LogNormal 10,1"n)), Where(":CONFIG1" == "1"))
This Where-clause for data table 'tabletest.jmp' resulted in no rows: ":CONFIG1" == “1"

I know the expression evaluation is a recurring topic in this forum, but I spent a lot of time trying to make it work and still no success

 

Thanks a lot in advance

 

Voiz

 

Names Default To Here( 1 );
clear symbols();
Deletesymbols();

//Create table with random distribution 
dt = New Table( "tabletest",
	Add Rows( 150 ),
	New Column( "LogNormal 10,1", Numeric, "Continuous", formula( Random Lognormal( 10, 1 ) ) ),
	New Column( "Normal 10,1", Numeric, "Continuous", formula( Random Normal( 10, 1 ) ) ),
	New Column( "Gamma 10,1", Numeric, "Continuous", formula( Random Gamma( 10, 1 ) ) ),
	New Column( "Normal 10,2", Numeric, "Continuous", formula( Random Gamma( 10, 2 ) ) ),
	New Column( "CONFIG1", Character, "Nominal", formula(char(Random Integer( 1, 3 )))),
	New Column( "CONFIG2", Character, "Nominal", formula(char(Random Integer( 1, 3 ))));
	
);
Column( dt, "LogNormal 10,1" ) << set property( "spec limits", {LSL( 0 ), USL( 400000 ), Show Limits( 0 )} );
Column( dt, "Normal 10,1" ) << set property( "spec limits", {LSL( 6 ), USL( 14 ), Show Limits( 0 )} );
Column( dt, "Gamma 10,1" ) << set property( "spec limits", {LSL( 0 ), USL( 40 ), Show Limits( 0 )} );

dt << save( "$Desktop\tabletest.jmp" );

SplitBy = "CONFIG1";

//Get a list from all unique configs
summarize(ColumnSplitBy=by(Column (SplitBy)));
show(ColumnSplitBy);
For( i = N Items( ColumnSplitBy ), i > 0, i--,
  If( ColumnSplitBy[i] == "",
  Remove From( ColumnSplitBy, i, 1 );
  )
);

//Get Column only with limits (At east LSL or USL, I don't care about target)
MetricCols = dt << Get Column Names( numeric, continuous );

Show( MetricCols );

For( i = N Items( MetricCols ), i >= 1, i--, 

	Q = Column( MetricCols[i] ) << Get Property( "Spec limits" );
	Show( Q );

	spec_x = Eval List( {Arg( Q, 1 )/*, Arg( Q, 2 ), Arg( Q, 3 )*/} );
	Show( spec_x );
	If( N Row( Loc( spec_x, Empty() ) ),
		Remove From( MetricCols, i )
	);
);
 
k=1;
//Loop to run through all configs
For ( j = 1, j <= N Items( ColumnSplitBy ), j++,
Show( j );

//Loop to run Distribution > Fit ALL > Capability and collect the stats
	For( i = 1, i <= N Items( MetricCols ), i++,
		Show( i );
	
		////////////////////////////////////////////////////// Option 1: That works well, but :CONFIG1 is hardcoded
		x = Eval Expr(
			dis = dt << Distribution(
					Continuous Distribution( Column( Expr(MetricCols[i] ))),
				Where(:CONFIG1 == Expr(ColumnSplitBy[j])))
			);		
			
		print (x);
		Eval (x);
		
/*		////////////////////////////////////////////////////// Option 2 : That doesn't work 
		x = Eval Expr(
			dis = dt << Distribution(
					Continuous Distribution( Column( Expr(MetricCols[i] ))),
				Where(Expr(Column(SplitBy)) == Expr(ColumnSplitBy[j])))
			);		
			
		print (x);
		Eval (x);		*/
		
/*		////////////////////////////////////////////////////// Option 3 : That doesn't work 
		x = Eval Expr(
			dis = dt << Distribution(
					Continuous Distribution( Column( Expr(MetricCols[i] ))),
				Where(Expr(":"||SplitBy) == Expr(ColumnSplitBy[j])))
			);		
			
		print (x);
		Eval (x);		*/	
	
	);
);
1 ACCEPTED SOLUTION

Accepted Solutions
txnelson
Super User

Re: Using Expr() and Eval() with variables name inside a loop

I believe this will work for you

x = Eval Expr(
			dis = dt << Distribution(
					Continuous Distribution( Column( Expr(MetricCols[i] ))),
				Where(as column(SplitBy) == Expr(ColumnSplitBy[j])))
			);	
Jim

View solution in original post

2 REPLIES 2
txnelson
Super User

Re: Using Expr() and Eval() with variables name inside a loop

I believe this will work for you

x = Eval Expr(
			dis = dt << Distribution(
					Continuous Distribution( Column( Expr(MetricCols[i] ))),
				Where(as column(SplitBy) == Expr(ColumnSplitBy[j])))
			);	
Jim
Voizingu
Level III

Re: Using Expr() and Eval() with variables name inside a loop

That works!! 

Thanks so much Jim!