Kann ich eine verkettete Zeichenfolge als Argument für eine Funktion verwenden?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Betrachten Sie dieses einfache Beispiel:
dt2 = aktuelle Datentabelle();
b = 140;
bc = char(b);
drucken(b);
print(bc);
dt2 << Neue Spalte("range"||bc||"v1",
Numerisch,
Formel(b)
);
// dt2 = aktuelle Datentabelle();
dt2 << Neue Spalte("Bereich",
Numerisch,
Formel(Maximum(:Name("AA"||bc), :Name("BB"||bc), :Name("CC"||bc)) - Minimum(:Name("AA"||bc) , :Name("BB"||bc), :Name("CC"||bc)))
);
Das ist die Tabelle:

Fehlermeldung zurückgegeben:

Ich beschäftige mich nur sehr wenig mit JSL-Programmierung, also bitte um Hilfe!!Ich würde es lieben, wenn das funktioniert.
Betreff: Kann ich eine verkettete Zeichenfolge als Argument für eine Funktion verwenden?Ups, das tut mir leid! JSL-Codierung bis spät in die Nacht Es sieht so aus, als ob Craige den Klammerfehler erkannt hat, der dieses Problem verursacht hat, und auch die Dinge vereinfacht hat (danke). Craige !).
julianisch
Betreff: Kann ich eine verkettete Zeichenfolge als Argument für eine Funktion verwenden?Hallo Craige,
Ich werde das versuchen.Ich glaube, der Grund dafür, dass ich Name() im Skript gefunden habe, ist, dass ich es direkt aus dem Formeleditor für eine andere Formel kopiert habe.Und jetzt glaube ich, dass ich das Problem mit den Klammern sehe.
Danke!
Betreff: Kann ich eine verkettete Zeichenfolge als Argument für eine Funktion verwenden?Hallo Julian,
Ich habe Ihr Skript ausprobiert und es scheint teilweise zu funktionieren.Als ich es ausgeführt habe, bekam ich Folgendes:

Der Wert in der Spalte „Bereich“ sollte 5 und nicht 15 sein.
und im Protokoll stand Folgendes (was ich nicht verstehe):

Es scheint, als ob das Maximum richtig ausgewertet wurde und es dann dort aufhört.Irgendwelche Ideen?Vielen Dank für Ihre Hilfe
Skript:
dt2 = aktuelle Datentabelle();
b = 140;
bc = char(b);
drucken(b);
print(bc);
dt2 << Neue Spalte("bias"||bc||"v1",
Numerisch,
Formel(b)
);
// dt2 = aktuelle Datentabelle();
dt2 << Neue Spalte("Bereich",
Numerisch,
);
eval(parse(EvalInsert(
„\[
:Range << Set Formula( Maximum(:Name("^"AA_"||bc^"), :Name("^"BB_"||bc^"), :Name("^"CC_"||bc )^") -
Minimum(:Name("^"AA_"||bc^"), :Name("^"BB_"||bc^"), :Name("^"CC_"||bc^"))
)
]\")));
Betreff: Kann ich eine verkettete Zeichenfolge als Argument für eine Funktion verwenden?Ein paar weitere Informationen als Ergänzung zu Julians Antwort.
Ja, Sie können die Verkettung verwenden, um ein Argument für die meisten Funktionen zu erstellen.Der Name ist eine der wirklich seltsamen Ausnahmen; Name() ist ein Hilfsprogramm zur Analysezeit, keine Laufzeitfunktion.
Die meisten JSL-Variablennamen sind wohlgeformt, eine Folge von Buchstaben und Zahlen sowie Unterstrichen und Leerzeichen, die vom JMP-Parser leicht verstanden werden können.Deine Namen, AA_140 usw. sind wohlgeformt.Manchmal erweisen sich Variablennamen als chaotisch.Typischerweise geschieht dies mit eingebetteten Kommas oder Minuszeichen: Röntgen oder Äpfel, Birnen .Irgendwie kann man mit diesen Variablennamen keinen JSL-Ausdruck schreiben, ohne ihn in Anführungszeichen zu setzen. Der Name()-Wrapper macht genau das:
name("Röntgen") + name("Äpfel, Birnen")
addiert die beiden Variablen.Der Name wird verarbeitet (nicht ausgeführt), wenn der JSL-Quellcode analysiert wird, nicht wenn er ausgeführt wird.Das Argument für Name muss zum Zeitpunkt der Analyse eine einfache Zeichenfolge sein.Julians Code verwendet die Zeichenfunktionen von JMP, um die verkettete Zeichenfolge vorab zu erstellen und an die Parse-Funktion zu senden.
Da die Variablennamen wohlgeformt sind (immer eine gute Idee), ist der Namenswrapper nicht erforderlich und Julians Idee kann noch weiter vereinfacht werden.(Dies behebt auch eine falsch platzierte Klammer.)
eval(parse(EvalInsert(
„\[
:Bereich << Formel festlegen(
Maximum(^":AA_" || bc^, ^":BB_" || bc^, ^":CC_" || bc^) -
Minimum(^":AA_" || bc^, ^":BB_" || bc^, ^":CC_" || bc^) )
]\")));

Es gibt andere JSL-Funktionen zum direkten Bearbeiten von Formeln, ohne Zeichenfolgen zu erstellen und zu analysieren, aber Julians EvalInsert-Idee ermöglicht es Ihnen, die benutzerfreundliche Zeichenmanipulation in JSL zu verwenden.
Betreff: Kann ich eine verkettete Zeichenfolge als Argument für eine Funktion verwenden?Hallo shehzaad.kaka ,
Ich konnte dies zum Laufen bringen, indem ich einen Ausdruck mit „eval“, „parse“ und „eval insert“ erstellte. Da Sie sagten, Sie seien neu bei JSL, stelle ich mir vor, dass dies ziemlich kryptisch aussehen wird, also lassen Sie mich zwei wichtige Teile davon durchgehen.
Als erstes habe ich die Festlegung der Formel auf einen eigenen Teil verschoben, getrennt von der Erstellung der Spalte. Auf diese Weise können wir uns auf die Erstellung eines Ausdrucks konzentrieren, der lediglich die Spaltenformel festlegt. Der Großteil davon besteht aus Eval(Parse(EvalInsert( ))); macht gerade.EvalInsert ist ein praktisches Tool, um eine Zeichenfolge zu übernehmen und in Variablen oder Funktionen von Variablen zu ersetzen. Sie können angeben, dass Sie eine Ersetzung wünschen, indem Sie die Funktion oder Variable mit ^ ^ umschließen. Zum Beispiel:
g = „Welt“;
h = EvalInsert("Hallo ^g^ ");
Bildunterschrift(h);
h wäre in diesem Fall gleich „Hallo Welt“, was in einem Beschriftungsfeld mit dem obigen Code angezeigt wird.
In Ihrer Situation habe ich evalInsert für die Spaltennamen verwendet:
:Name("^"AA_"||bc^")
Wenn wir das auseinandernehmen, wird es klarer
:Name(" ^ "AA_" || bc ^ ")
Die Funktion :Name() erfordert Text in Anführungszeichen, daher stehen am Anfang und am Ende der Klammern Anführungszeichen. Als nächstes haben wir das ^ ^ um Ihre Verkettung gewickelt. Evalinsert verarbeitet dies und die Funktion :Name() verbleibt mit der in Anführungszeichen gesetzten Zeichenfolge AA_140. EvalInsert ersetzt überall dort, wo etwas in ^ ^ eingeschlossen ist. Es gibt eine besondere Komplikation: Unser Ausdruck, den wir erstellen, muss Anführungszeichen enthalten, wir müssen jedoch Anführungszeichen verwenden, um die Zeichenfolge selbst zu kennzeichnen. Um dies zu bewältigen, können wir JMP mitteilen, dass jedes Anführungszeichen tatsächlich als Anführungszeichen gedacht ist (und nicht als Teil der JMP-Syntax), indem wir jedem Anführungszeichen \! voranstellen. (Schrägstrich) oder machen Sie es wie unten beschrieben und setzen Sie \[ nach dem Anfangszitat und ]\ vor das Endzitat. Dies „entgeht“ allen Anführungszeichen in dem Ausdruck, den wir erstellen.
Als nächstes wandelt Parse() die Zeichenfolge in einen JSL-Ausdruck um und schließlich führt Eval() den JSL-Ausdruck aus und weist die Formel der Spalte zu.
Ich hoffe das hilft!
julianisch
PS: Ihr Code hatte keine Unterstriche für die Spaltennamen, also habe ich diese hinzugefügt.
dt2 = aktuelle Datentabelle () ;
B = 140 ;
v. Chr = verkohlen ( B ) ;
drucken ( B ) ;
drucken ( v. Chr ) ;
dt2 << Neue Spalte ( "Reichweite" || v. Chr || „v1“ ,
Numerisch ,
Formel ( B )
) ;
// dt2 = aktuelle Datentabelle();
dt2 << Neue Spalte ( "Reichweite" ,
Numerisch ,
) ;
evalu ( analysieren ( EvalInsert (
„\[
:Range << Set Formula( Maximum(:Name("^"AA_"||bc^"), :Name("^"BB_"||bc^"), :Name("^"CC_"||bc )^") - Minimum(:Name("^"AA_"||bc^"), :Name("^"BB_"||bc^"), :Name("^"CC_"||bc^" ))
)
]\" ))) ;