cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
The Discovery Summit 2025 Call for Content is open! Submit an abstract today to present at our premier analytics conference.
Choose Language Hide Translation Bar
Voizingu
Level IV

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 IV

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

That works!! 

Thanks so much Jim!