JSL で列の式を動的に設定するI'm working on a JSL script where I need to dynamically build a formula for a given column inside a loop. The idea is to reference a different column for each iteration, so that the formula uses the evaluated column name (e.g., :col_name) rather than inserting the literal code.
ループで実現しようとしていることの簡略版を以下に示します (このコードで Expr、Eval、Parse のさまざまなバリエーションを試しましたが、効果はありませんでした)。
all_cols = dt << Get Column Names();
col = Column(all_cols[N Items(all_cols)-1]); // Changes for every i in the loop
// Dynamically build the formula expression using column names directly
formula = If(
col > :UL_outliers | col < :LL_outliers,
1,
0
);
outlier_col << Set Formula(formula);The problem is that when I set the formula using Set Formula(), instead of dynamically evaluating the column reference, the formula is inserted literally into the column's formula editor. As a result, the column formula is not evaluated and is simply:
If(
col > :UL_outliers | col < :LL_outliers,
1,
0
);動的に作成された数式は評価されませんやその他の関連投稿を読みましたが、頭が混乱しています。外れ値の列に 1 または 0 がいくつか欲しいだけです。
ご協力や回避策があれば、ぜひお知らせください。よろしくお願いします!
自動化とスクリプトRe: JSL で列の数式を動的に設定する何をしようとしているのか100%は分かりませんが、これはいくつかのアイデアを与えるかもしれません
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
dt << new column("LL_outliers", Numeric, Continuous, Set Each Value(50));
dt << new column("UL_outliers", Numeric, Continuous, Set Each Value(70));
all_cols = dt << Get Column Names("Continuous", "String");
colname = all_cols[1];
f_expr = Substitute(
Expr(If(_col_ > :UL_outliers | _col_ < :LL_outliers,
1,
0
)),
Expr(_col_), Name Expr(AsColumn(dt, colname));
);
new_col = dt << New Column("F", Numeric, Nominal);
Eval(EvalExpr(
new_col << Set Formula(Expr(NameExpr(f_expr)));
));Re: JSL を使用して列の数式を動的に設定するJMP には文字列データ型があります:
a = "猫";
b = "3 + 5";
a と b は文字列です。B は式のように見えますが、そうではありません。
c = 解析(b);
c はツリーとして表示できる式です。
operator(+)
/ \
3 5
c = expr( 3 + 5 ); // 同じ式をcに格納する別の方法です
d = eval( c ); // または単に d = c; 右側はいずれにせよ評価されます
dは8です。
JMP は c を 8 に自動的に評価することもあれば、そうでないこともあります。8 が必要な場合もあれば、3+5 が必要な場合もあります。
e = 名前式(c);
e は c が保持する式を取得します。nameexpr を薄いラッパーと考えてください。ラッパーが評価されると、より深い評価がブロックされ、8 ではなく、評価されていない 3+5 式が返されます。
JMP には、式ツリーを操作するための関数のセットもありますが、ここでは説明しません。たとえば、 @jthi は、substitute を使用しました。
あなたが困惑していることの一部は、JSL のさまざまな関数が式の引数を処理する方法の違いだと思います。
cos(c) は、ほとんどの関数と同様に、 c を 8 と評価します。 これは予想どおりの結果です。
列名< 式 (c、3+5ではなく、8でもない) を文字通りコピーします。 8)列の式を評価せずに適用します。(<
したがって、setformula には 2 つの特殊なケースがあります。
列名< c (特別ではない)
列名< 8 (eval ラッパー)
列名< 3+5 (nameexpr ラッパー)
これらは実際には特殊なケースであることに注意してください。setformula は、JSL が期待どおりに動作するように、eval または nameexpr ラッパーを検出するために特別な努力をします。
ほぼ完了したので、この部分で 3+8 ではなく x+y を使用すればよかったと思います。そうすれば、評価を後の時点に延期する理由がより明確になります。また、8 のような単一の数字も式です。eval(8) は 8 です。
Re: JSL で列の数式を動的に設定する頭を悩ませるけれども非常に勉強になる説明をありがとうございます。少なくとも概念的には理解できたと思います。
きっと分かるよ。
どうもありがとう !:)