Hallo,
Ich habe versucht, neue Spalten in einer Schleife mit ein paar Variablen in der Formel zu erstellen. Die Variablen sind Spaltennamen, die ich zu subtrahieren versuche. Ich habe ähnliche Threads mit Leuten gelesen, die ein ähnliches Problem haben, aber keine dieser Lösungen hat in meinem Fall funktioniert. Ein Ausschnitt aus meiner Schleife:
for (i=1, i<=n, i++,
S="Mean("||vars[i]||")";
S2="Wafer Mean("||vars[i]||")";
ddt << Update(
With(wt),
Match Columns(
:Lot = :Lot,
:Wafer = :Wafer,
:Recipe = :Recipe,
:LayoutSizeY = :LayoutSizeY,
Eval(cats) = Eval(cats)
),
Add Columns from Update table(
wt:S2;
)
);
ddt << New Column("Delta from wafer mean("||vars[i]||")", numeric, continuous, formula(ddt:S-ddt:S2));
ddt << Run formulas;
);
Das Problem ist, dass JMP es buchstäblich liest und statt der Zeichenfolge S in die Formel einfügt. Ich habe verschiedene eval-, evalexpr-, expr-, ersatzbefehle ausprobiert, aber keiner hat die erforderlichen ergebnisse erzielt.
Irgendwelche anderen Vorschläge?
Vielen Dank
Hallo @ jjswan33 .
Willkommen in der Community!
Bei den von Ihnen untersuchten Lösungen handelt es sich jeweils um geeignete Lösungen für das, was Sie tun möchten. In Ihrem Skript gibt es jedoch einige Probleme:
1 Sie müssen den Spaltenverweis auf die Tabelle "ddt" in der Formel nicht definieren, da der Bereich impliziert, dass sich die in der Formel referenzierten Spalten in derselben Tabelle befinden wie die Spalte selbst. Durch das Einfügen von "ddt" wird dies in die Spaltenformel hartcodiert. Dies bedeutet, dass die Formel nicht funktioniert, wenn ddt nicht mehr definiert ist.
2 Sie müssen die Spaltennamen in ": Name ()" einschließen, da der Spaltenname Sonderzeichen enthält, insbesondere die Klammern. Sie können sich beispielsweise auf eine Spalte "Var1" beziehen als: Var1, Sie können sich jedoch nicht auf eine Spalte "Mean (Var1)" beziehen als: Mean (Var1); Sie müssten verwenden: Name ("Mean (Var1)").
Nun, ich bin ein Teil von Eval (Parse (Eval Insert ())), weil ich denke, es ist ziemlich leicht zu verstehen. Beginnen wir mit dem innersten Teil, Eval Insert, und arbeiten wir uns dann nach außen durch.
- Eval Insert () - Verwenden Sie diese Option, um Variablen innerhalb einer Zeichenfolge auszuwerten. Platzieren Sie in der Zeichenfolge "^" - Zeichen um alle Variablen, die Sie in der Zeichenfolge auswerten möchten. Zum Beispiel:
age = 30;
Eval Insert("She is ^age^ years old");
//Returns "She is 30 years old"Wenn Sie doppelte Anführungszeichen in der Zeichenfolge verwenden müssen (was Sie in Ihrem Fall tatsächlich tun), kann es hilfreich sein, die Zeichenfolge mit "\ [" zu beginnen und mit "] \" zu enden. Dadurch können Sie doppelte Anführungszeichen innerhalb der Zeichenfolge verwenden. Alternativ können Sie die Escape-Syntax verwenden, um doppelte Anführungszeichen (dh \! ") In die Zeichenfolge einzufügen. Hier ist eine Zeichenfolge, die für Sie funktionieren sollte:
str = "\[ddt << New Column( "Delta from wafer mean(^vars[i]^)", numeric, continuous, formula( :Name("^S^") - :Name("^S2^") ) )]\"; - Parse () - wandelt die Zeichenfolge in einen Ausdruck um.
- Eval () - wertet den von der Zeichenfolge aus analysierten Ausdruck aus.
Um alles zusammenzufassen, machen Sie so etwas:
str = "\[ddt << New Column( "Delta from wafer mean(^vars[i]^)", numeric, continuous, formula( :Name("^S^") - :Name("^S2^") ) )]\";
For( i = 1, i <= n, i++,
S = "Mean(" || vars[i] || ")";
S2 = "Wafer Mean(" || vars[i] || ")";
ddt << Update(
With( wt ),
Match Columns(
:Lot = :Lot,
:Wafer = :Wafer,
:Recipe = :Recipe,
:LayoutSizeY = :LayoutSizeY,
Eval( cats ) = Eval( cats )
),
Add Columns from Update table( wt:S2 )
);
Eval(Parse(Eval Insert( str )));
ddt << Run formulas;
);Beachten Sie, ich hätte die Definition der Zeichenfolge außerhalb der Schleife überspringen können und die Zeichenfolge direkt in Eval Insert innerhalb der Schleife geklebt. Ich denke jedoch, das macht Ihren Code ein bisschen einfacher zu debuggen. Wenn Sie Fehler erhalten, schauen Sie sich dazu Parse (Eval Insert (str)) an und prüfen Sie, ob der Ausdruck richtig aussieht.
Hoffentlich hilft das!