Spaltenformel dynamisch mit JSL festlegenI'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.
Hier ist eine vereinfachte Version dessen, was ich in der Schleife erreichen möchte (ich habe in diesem Code viele Variationen von Expr, Eval und Parse ohne Erfolg ausprobiert):
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
);Ich habe „Dynamisch erstellte Formeln, die nicht ausgewertet werden“ und einige andere verwandte Beiträge gelesen, aber mir schwindet der Verstand. Ich möchte einfach nur ein paar Einsen oder Nullen in meiner Ausreißerspalte.
Für jede Hilfe oder Problemumgehung wäre ich sehr dankbar. Vielen Dank im Voraus!
Automatisierung und SkriptingBetreff: Spaltenformel dynamisch mit JSL festlegenNicht 100% sicher, was Sie versuchen zu tun, aber dies könnte einige Ideen geben
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)));
));Betreff: Spaltenformel dynamisch mit JSL festlegenJMP hat einen String-Datentyp:
a = "Katze";
b = "3 + 5";
a und b sind Zeichenfolgen. B sieht aus wie ein Ausdruck, ist aber keiner.
c = parse( b );
c ist ein Ausdruck, der als Baum dargestellt werden kann:
operator(+)
/ \
3 5
c = expr( 3 + 5 ); // ist eine andere Möglichkeit, den gleichen Ausdruck in c zu speichern
d = eval( c ); // oder einfach d = c; die rechte Seite wird trotzdem ausgewertet
d ist 8.
Manchmal wertet JMP c automatisch als 8 aus, manchmal nicht. Manchmal möchten Sie 8, manchmal 3+5.
e = Namensausdruck(c);
e erhält den Ausdruck, den c enthält. Stellen Sie sich nameexpr als einen dünnen Wrapper vor. Wenn der Wrapper ausgewertet wird, blockiert er eine tiefere Auswertung und gibt den Ausdruck 3+5 unausgewertet zurück, statt 8.
JMP verfügt auch über eine Reihe von Funktionen zum Bearbeiten eines Ausdrucksbaums, die hier nicht behandelt werden. @jthi hat beispielsweise „substitute“ verwendet.
Ich glaube, Sie rätseln teilweise über die Unterschiede in der Art und Weise, wie verschiedene Funktionen in JSL mit einem Ausdrucksargument umgehen:
cos(c) wertet wie die meisten Funktionen c bis 8 aus. Das ist, was Sie erwarten.
Spaltenname< kopiert wörtlich den Ausdruck (c, nicht 3+5, nicht 8) 8) an die Spaltenformel an, ohne sie auszuwerten. (Genau wie bei <
Daher gibt es bei setformula zwei Sonderfälle :
Spaltenname< c (nicht speziell)
Spaltenname< 8 (Eval-Wrapper)
Spaltenname< 3+5 (Nameexpr-Wrapper)
Beachten Sie, dass es sich hierbei tatsächlich um Sonderfälle handelt. Setformula unternimmt zusätzliche Anstrengungen, um den Eval- oder Nameexpr-Wrapper zu erkennen, damit die JSL das Erwartete tut.
Jetzt, wo ich fast fertig bin, wünschte ich, ich hätte für einen Teil davon x+y statt 3+8 verwendet; dann wäre klarer, warum man die Auswertung auf einen späteren Zeitpunkt verschieben sollte. Auch eine einzelne Zahl wie 8 ist ein Ausdruck; eval(8) ergibt 8.
Betreff: Spaltenformel dynamisch mit JSL festlegenVielen Dank für die verwirrende, aber sehr lehrreiche Erklärung. Ich glaube, ich verstehe es zumindest konzeptionell.
Ich schätze, ich werde es herausfinden.
Vielen Dank !:)