Wie verwende ich Spaltenwerte als Eingabe für eine Formel in einem Skript?Alle,
Ich glaube, meine Frage ist sehr einfach, aber ich habe noch keine Antwort gefunden.
Ich habe eine Datentabelle wie unten gezeigt

Ich wünsche
a) 3 neue Spalten mit der Bezeichnung %CFB Spalte 3 hinzufügen, %CFB Spalte 4 und %CFB Spalte 5. %CFB steht für % Veränderung gegenüber dem Ausgangswert.
b) In jede neue Spalte möchte ich die prozentuale Änderung gegenüber dem Ausgangswert mit Werten eingeben, die aus der folgenden Formel abgeleitet werden
%CFB = (x – Spalte 3)/Spalte 3, wobei „x“ bei jeder unten codierten Iteration durch Werte aus Spalte 3, 4 oder 5 ersetzt wird.Spalte 3 ist der Basiswert
dt = Current Data Table();
startcol = 3;
endcol = 5;
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
New column ("%CFB " || data_col) << Formula((( :data_col - :column 3) / :column 3) * 100 ));
Mit dem obigen Skript konnte ich die neuen Spalten erstellen, aber es werden keine Ergebnisse aus der Formel darin platziert.Wenn ich manuell tausche Spalte 3 für data_col In der Formel werden alle neuen Spalten erwartungsgemäß als Null ausgewertet.Dies zeigt mir, dass die Formel zumindest korrekt ist und die Variable data_col nicht so interpretiert/ersetzt wird, wie ich es gerne hätte.Jeder Einblick, wie dies funktioniert, wäre dankbar.
Vielen Dank im Voraus für Ihre Hilfe
Floyd Fox
Betreff: Wie verwende ich Spaltenwerte als Eingabe für eine Formel in einem Skript?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich weiß nicht, wie viele Meinungen willkommen sind, aber hier geht es weiter.
Persönlich bin ich ein großer Gegner von Eval(Parse()), nur weil es die Lesbarkeit im Editor drastisch einschränkt.Ich habe 5000-Zeilen-Skripte gesehen, die zum größten Teil komplett rosa sind (oder welche Farbe auch immer Sie für Ihre Zeichenfolgen wählen).Mit der Möglichkeit, Ausdrücke zu ersetzen, behalten Sie die Hervorhebung Ihrer Syntax bei und machen es meiner Meinung nach viel einfacher, das Skript anderer Leute zu bearbeiten.
Ich verwende immer noch sehr gelegentlich eval(parse()), ich versuche jedoch, JSL quote() zu verwenden, wenn ich muss.
Betreff: Wie verwende ich Spaltenwerte als Eingabe für eine Formel in einem Skript?Hervorragender Hinweis zum Umgang mit dem Scoping dort WK Alles zusammen einpacken für floydfoxfb mit etwas Codeformatierung.
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
new_col_name = "%CFB " || data_col;
Eval(
Eval Expr(
dt << New Column( Expr(new_col_name),
Numeric,
Continuous,
Formula( ((Column( dt, Expr( data_col ) )[] - :column 3) / :column 3) * 100 )
)
)
);
);
Eine weitere Problemumgehung für den Variablenbereich wäre die Verwendung von „Jeden Wert festlegen“ (Gleichung) anstelle von „Formel“ (Gleichung).Dies hat den Vorteil, dass weniger Ressourcen verbraucht werden, da eine Formel nicht berechnet wird, es hat jedoch den Nachteil, dass bei der Änderung dieser Formel Verluste entstehen.
Wie bei allem Guten gibt es viele Möglichkeiten, ein Problem mit den richtigen Werkzeugen anzugehen.Wie Sie bereits erwähnt haben, ist Substitute() auch eine großartige Option, wenn die Dinge komplexer werden.Substitute ist besonders nützlich in Kombination mit Parse(), das Strings in JSL-Code umwandelt, und Eval(), das dann die Ausführung der JSL ermöglicht, was zu Eval(Parse(Substitute()))-Anweisungen führt.Diese letzte Technik ist besonders nützlich, wenn die Funktionalität in integrierte JMP-Plattformen integriert wird.Um die Kombination von parse() und eval(parse) weiter zu veranschaulichen, habe ich ein einfaches Beispiel eingefügt.

Viel Spaß beim Codieren!
Betreff: Wie verwende ich Spaltenwerte als Eingabe für eine Formel in einem Skript?Hallo,
In diesem Beispiel erscheint die Variable data_col weiterhin in der Formel.Da Sie data_col in einer For-Schleife zuweisen, führen alle Versuche, die Formeln nach Abschluss der Schleife auszuwerten, zu denselben Werten in allen drei neuen Spalten.Dies liegt daran, dass data_col den letzten Wert aus der For-Schleife, „Spalte 5“, darstellt.Angenommen, Sie speichern die Tabelle und schließen dann JMP.Wenn Sie die Tabelle in einer neuen Instanz von JMP erneut öffnen und versuchen, die Formel auszuwerten, wird ein Fehler angezeigt, da JMP nicht mehr weiß, was data_col darstellen soll.
Wenn Sie eine Variable in einer Formel verwenden, müssen Sie JMP anweisen, die Variable durch ihren Wert zu ersetzen, bevor Sie die Formel auswerten.Sie können Substitute() verwenden, aber ich finde, dass die Eval Expr()-Methode (as vince.faller0 erwähnt) ist für die meisten Menschen einfacher umzusetzen.Eval Expr() weist JMP an, alle Variablen auszuwerten (zu ersetzen), die in eine Expr()-Funktion innerhalb des Ausdrucks eingeschlossen sind, den Sie als Argument angeben. Eine äußere Eval() veranlasst JMP, die gesamte New Column-Anweisung auszuwerten, nachdem die Ersetzung erfolgt ist.JMP-Nutzungshinweis 41824 demonstriert auch dieses Konzept.
Ich hoffe das hilft.
Wendy
Betreff: Wie verwende ich Spaltenwerte als Eingabe für eine Formel in einem Skript?Vince,
Danke dafür.Ehrlich gesagt muss ich etwas über den von Ihnen bereitgestellten Ausdruck lesen, aber ich freue mich sehr über Ihre Einsicht, warum mein Code nicht funktioniert hat.
Grüße
Floyd
Betreff: Wie verwende ich Spaltenwerte als Eingabe für eine Formel in einem Skript?Nate,
Vielen Dank, dieser Code funktioniert und hat den zusätzlichen Vorteil, dass ich die Logik hinter dem Code verstehen kann.
Floyd
Betreff: Wie verwende ich Spaltenwerte als Eingabe für eine Formel in einem Skript?vince.faller0 hat tatsächlich die Ursache des Problems genau identifiziert.In der Datentabelle gibt es keine Spalte mit dem Namen data_col.Daher bezieht sich der geschriebene Code auf etwas, das nicht existiert.Außerdem zeigt Vince einige der leistungsstarken Möglichkeiten, mit JSL den Code zu schreiben, der dynamische Referenzen enthält.Allerdings haben Sie in jeder guten Sprache mehrere Möglichkeiten, Logik auszuführen.
Ich würde vorschlagen, ein alternatives Format für die Referenzierung der Spalte zu verwenden.Während das einfache Format darin besteht, das Semikolon und den Spaltennamen zu verwenden, um auf die aktuellen Datentabellenspalten zu verweisen, besteht eine leistungsfähigere Möglichkeit darin, das Spaltenformat (Datentabellenreferenz, Spaltenzeichenfolge oder Zahl) zu verwenden.Unten habe ich Ihren Code leicht geändert, um dieses Format zu verwenden.
dt = Current Data Table();
startcol = 3;
endcol = 5;
For( i = startcol, i <= endcol, i++,
data_col = Column( i ) << get name;
col_name = "%CFB " || data_col;
dt << New Column(col_name,
Numeric,
Continuous,
Formula( ((column(dt, data_col)[] - :column 3) / :column 3) * 100 ) );
);
Betreff: Wie verwende ich Spaltenwerte als Eingabe für eine Formel in einem Skript?Sie können :variable nicht ausführen (insbesondere bei einer Zeichenfolge, die Ihnen <
Wenn Sie es ändern in
data_col = Column( i ) ;
Eval(EvalExpr(New column ("%CFB " || Expr(data_col<<GET name=""></GET>
es sollte funktionieren.
Es ersetzt lediglich alle Expr()s in EvalExpr() durch ihre tatsächlichen Werte anstelle von Variablen.