cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Have your say in shaping JMP's future by participating in the new JMP Wish List Prioritization Survey
Choose Language Hide Translation Bar

JSL script to create or condition by looping thorough column names in a list

I'd like to create a function in jsl that takes a given list of column names as input, uses those columns to do a OR condition, and outputs a column with that looping OR formula. How do U do that? 

 

input_col_list = { "a", "b", "c"};
input_dt = dt;
x = 0.1;
input_dt << New Column("d", numeric, continuous, 
formula ( 
If(
(As Column("a") >= x  |  As Column("b") >= x  | As Column("c") >=  x), 
1,
0
) 
));

For above, I would like to make a function like below: 

my_func =
Function(
{input_dt, input_col_list, x},
{//local var},
// function body
...
Return As column("d")
);
1 ACCEPTED SOLUTION

Accepted Solutions
txnelson
Super User

Re: JSL script to create or condition by looping thorough column names in a list

Here is an example of one way to do it.......others may have more eloquent ways

Names Default To Here( 1 );
dt = 
// Open Data Table: Big Class.jmp
// → Data Table( "Big Class" )
Open( "$SAMPLE_DATA/Big Class.jmp" );

my_func = Function( {input_dt, input_col_list, x},
	{input_dt, input_col_list, x, the_cmd},
	input_dt << New Column( "d" );
	current data table(input_dt);
	the_cmd = "current data table():d << set formula( If(  current data table():\!"" ||
	Char( input_col_list[1] ) || "\!"n >= " || Char( x );
	For( i = 2, i <= N Items( input_col_list ), i++,
		the_cmd = the_cmd || " | current data table():\!"" || Char( input_col_list[i] ) || "\!"n >= "
		 || Char( x )
	);
	the_cmd = the_cmd || ", 1, 0) );";
	Eval( Parse( the_cmd ) );
);

input_col_listx = {"Height", weight};
dtx = Data Table( "big class" );
xx = 101;

theReturn = my_func( dtx, input_col_listx, xx );

 

Jim

View solution in original post

2 REPLIES 2
txnelson
Super User

Re: JSL script to create or condition by looping thorough column names in a list

Here is an example of one way to do it.......others may have more eloquent ways

Names Default To Here( 1 );
dt = 
// Open Data Table: Big Class.jmp
// → Data Table( "Big Class" )
Open( "$SAMPLE_DATA/Big Class.jmp" );

my_func = Function( {input_dt, input_col_list, x},
	{input_dt, input_col_list, x, the_cmd},
	input_dt << New Column( "d" );
	current data table(input_dt);
	the_cmd = "current data table():d << set formula( If(  current data table():\!"" ||
	Char( input_col_list[1] ) || "\!"n >= " || Char( x );
	For( i = 2, i <= N Items( input_col_list ), i++,
		the_cmd = the_cmd || " | current data table():\!"" || Char( input_col_list[i] ) || "\!"n >= "
		 || Char( x )
	);
	the_cmd = the_cmd || ", 1, 0) );";
	Eval( Parse( the_cmd ) );
);

input_col_listx = {"Height", weight};
dtx = Data Table( "big class" );
xx = 101;

theReturn = my_func( dtx, input_col_listx, xx );

 

Jim
jthi
Super User

Re: JSL script to create or condition by looping thorough column names in a list

Building this using strings is most likely most simple option as the expression is quite simple one. But... I don't like using Eval(Parse()) so here are few options which are not using that (second option might not do what you want with missing values)

Names Default To Here(1);

dt = New Table("Untitled 3",
	Add Rows(0),
	Compress File When Saved(1),
	New Column("a", Numeric, "Continuous", Format("Best", 12), Set Values([0,1])),
	New Column("b", Numeric, "Continuous", Format("Best", 12), Set Values([0,0])),
	New Column("c", Numeric, "Continuous", Format("Best", 12), Set Values([0,0]))
);
input_col_list = {"a", "b", "c"};
x = 0.1;

// using Or
or_expr = Expr(Or());
// https://community.jmp.com/t5/JSL-Cookbook-Archived/Insert-one-expression-into-another-using-Eval-Insert-Eval-Expr/ta-p/48998
For Each({col_name}, input_col_list,
	col_expr = Substitute(
		expr(_col_ref_ >= _comparison_value_),
		Expr(_col_ref_), NameExpr(AsColumn(Column(dt, col_name))),
		Expr(_comparison_value_), x
	);
	Insert Into(or_expr, Name Expr(col_expr));
);
// Show(name expr(or_expr));
Eval(EvalExpr(dt << New Column("d", Numeric, Continuous, Formula(
	If(Expr(name expr(or_expr)), 1, 0)
))));


// using matrix and any
col_refs = Transform Each({col_name}, input_col_list,
	Name Expr(As Column(Column(dt, col_name)));
);
Eval(EvalExpr(dt << New Column("d", Numeric, Continuous, Formula(
	Any(Matrix(Expr(col_refs)) >= Expr(x))
))));


// function of second option
create_check_col = function({dt, col_input, limit_val}, {Default Local},
	col_refs = Transform Each({col_name}, col_input,
		Name Expr(As Column(Column(dt, col_name)));
	);
	
	new_col = Eval(EvalExpr(dt << New Column("d", Numeric, Continuous, Formula(
		Any(Matrix(Expr(col_refs)) >= Expr(limit_val))
	))));
	
	return(new_col);
);
create_check_col(dt, input_col_list, x);
-Jarmo