wie man eine Spalte als Parameter in einer Formel übergibtHallo,
Ich versuche, eine einfache Formel für Spalten zu erstellen, die als Variablen in einer Liste gespeichert sind.
Ich verstehe nicht, warum JSL sich weigert, die Formel auszuführen.
Wenn ich in der Formel den Parameter durch die darin gespeicherte Zeichenfolge ändere, funktioniert es perfekt.
Irgendeine Hilfe ??
Hier ist der Code, den ich verwende:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
for(j=1, j <= N items(MyList), j++,
dt << New Column( ParamPlot[j], Formula( 2* ParamPlot[j]) );
);
Ich habe Dinge wie Eval, Eval expr ausprobiert, ... aber nein 
Betreff: Wie übergebe ich eine Spalte als Parameter in einer Formel?Kurz und effizient 
Vielen Dank 
Betreff: Wie übergebe ich eine Spalte als Parameter in einer Formel?Ich konnte einem letzten Versuch nicht widerstehen. Kurz und bündig und es funktioniert. Verwenden evalinsert Variablen auszuwerten, :Name() auf Spalten verweisen, „\[ ]\“ um doppelte Anführungszeichen innerhalb einer Zeichenfolge zuzulassen und schließlich zu verwenden eval(parse()) um die resultierende Zeichenfolge auszuführen.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
For( j = 1, j <= N Items( MyList ), j++,
new_col_expr = evalinsert("\[dt << New Column("^paramplot[j]^", Formula(2 * :name("^mylist[j]^")))]\");
eval(parse(new_col_expr));
);Betreff: Wie übergebe ich eine Spalte als Parameter in einer Formel?Zunächst einmal vielen Dank an alle für eure Antworten...
Hier ist meine Meinung zu allen vorgeschlagenen Lösungen:
1/ Die von Mark vorgeschlagene Lösung: Funktioniert perfekt (allerdings schwer zu lesen, wenn man nicht an Eval, Parse, Substitue usw. gewöhnt ist).
2/ Die von Jan vorgeschlagene Lösung: In der Tat besser in den Augen (verwendet auch eval, replacementinto,...). Funktioniert übrigens perfekt.
3/ Die Lösung von Byron: Verwendet auch Eval, Substitut, Expr... Funktioniert perfekt
4/ Die Lösung von pmroz ist bei weitem die einfachste (für das Auge), aber die Formel, die wir erhalten, bezieht sich immer noch auf MyList und nicht auf die Spalten, die sie darstellen sollten ... Das heißt, wenn ich einen Wert in der Spalte „Alter“ ändere " wird die Spalte „age2“ nicht aktualisiert.
Vielen Dank euch allen für die Vorschläge 
Betreff: Wie übergebe ich eine Spalte als Parameter in einer Formel?Wie Byron sagte, versuchen Sie, eine neue Spalte zu erstellen, die doppelt so groß ist wie sie selbst. Ich denke, das ist es, was Sie wollen. AS COLUMN hat es geschafft.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
For( j = 1, j <= N Items( MyList ), j++,
dt << New Column( ParamPlot[j], Formula( 2 * as column(dt, MyList[j]) ) )
);
Dies funktioniert hervorragend, solange Sie keine Zeilen hinzufügen. Dann benötigen Sie die Auswertungen, Ausdrücke usw.
Betreff: Wie übergebe ich eine Spalte als Parameter in einer Formel?Es sieht so aus, als würden Sie versuchen, eine Formel zu erstellen, die sich selbst mit 2 multipliziert. Dies funktioniert nicht und sollte einen leeren Wert zurückgeben.
Außerdem ist „j“ eine Funktion zum Erstellen von Matrizen (beachten Sie, dass sie im JSL-Editor blau wird), daher vermeide ich es normalerweise, „j“ als Variable zu verwenden, nur für den Fall, dass es auf unerwartete Weise interpretiert werden könnte.
Die Arbeit mit Spaltennamen und Referenzen kann ziemlich frustrierend sein. Schauen Sie sich diese Strategie an.
Innerhalb der Schleife wird zunächst die Spalte erstellt und ihr beim Erstellen ein Handle „newcol“ zur Verwendung als Referenz zugewiesen. Als nächstes gibt es die große eval(substitute))-Klausel. Innerhalb dieses Arguments wird „col<
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
For( i = 1, i <= N Items( MyList ), i++,
newcol=dt << New Column( ParamPlot[i] );
Eval(
Substitute(
Expr(
newcol << set formula( a * 2 ) ) ,
Expr( a ), As Name( mylist[i] )
);
));Betreff: Wie übergebe ich eine Spalte als Parameter in einer Formel?Vielleicht ist das (in den Augen einiger) etwas besser:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
For( j = 1, j <= N Items( MyList ), j++,
CMD = Expr(dt << New Column( NameTBD, Formula( 2 * colTBD) ));
SubstituteInto(CMD, Expr(NameTBD), ParamPlot[j], Expr(ColTBD), Parse(":"||MyList[j]));
CMD;
);
Betreff: Wie übergebe ich eine Spalte als Parameter in einer Formel?Das Problem besteht darin, dass das Argument von Formula() als Literalausdruck behandelt wird. Es wertet ParamPlot[j] nicht aus und ersetzt das Ergebnis nicht, um die gewünschte Formel zu erstellen. Es sieht so aus, als ob Sie in der Lage sein sollten, Ausdrücke zu verwenden, aber ich komme mit diesem Ansatz nicht weiter. Deshalb ist hier stattdessen eine Lösung, die auf Zeichenfolgen basiert:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
MyList = {"age", "height"};
ParamPlot = {"age2", "height2"};
For( j = 1, j <= N Items( MyList ), j++,
Eval(
Parse(
Substitute("dt << New Column( \!"nnn\!", Formula( 2 * :ppp ) )",
"nnn",
ParamPlot[j],
"ppp",
MyList[j]
)
);
);
);
Ich mag die Verwendung von Zeichenfolgen wirklich nicht, aber manchmal muss man tun, was man tun muss.