Voici un exemple d'une façon de le faire ....... d'autres peuvent avoir des façons plus éloquentes
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 );
Construire ceci en utilisant des chaînes est probablement l'option la plus simple car l'expression est assez simple. Mais... Je n'aime pas utiliser Eval(Parse()) donc voici quelques options qui ne l'utilisent pas (la deuxième option peut ne pas faire ce que vous voulez avec des valeurs manquantes)
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);J'aimerais créer une fonction dans jsl qui prend une liste donnée de noms de colonnes en entrée, utilise ces colonnes pour faire une condition OR et génère une colonne avec cette formule OR en boucle. Comment fais-tu ça?
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
)
));Pour ci-dessus, je voudrais faire une fonction comme ci-dessous:
my_func =
Function(
{input_dt, input_col_list, x},
{//local var},
// function body
...
Return As column("d")
);