Warum immer eine else-Anweisung verwenden und der grundlegende Unterschied zwischen leeren und fehlenden WertenHallo allerseits,
hier eine etwas theoretische Frage. Ich schreibe gerade ein JSL-Scripting-Tutorial für meine Kollegen und versuche daher sicherzustellen, dass ich die Funktionsweise von JSL gut verstehe.
Ich habe einmal in einem Forum gelesen, dass man immer eine „Else“-Anweisung innerhalb einer „If“-Schleife verwenden sollte, auch wenn das bedeutet, Empty() als „Else“-Anweisung hinzuzufügen.
Um den Unterschied zu erkennen, habe ich versucht, mit dem Skripteditor herumzuspielen:
y=if(1>2, 1);
z= if (1>2, 1 , Empty());
Show (y);
Show (z);
Show (Is Missing (y) );
Show (Is Missing (z) );
Show (Is Empty (y) );
Show (Is Empty (z) );
x= If (y==z, "true", "false");
Show (x); <BR /><BR />// results :<BR />y = .;<BR />z = Empty();<BR />Is Missing(y) = 1;<BR />Is Missing(z) = 1;<BR />Is Empty(y) = 0;<BR />Is Empty(z) = 1;<BR />x = .;
Der Wert Empty() ist also sowohl ein fehlender als auch ein leerer Wert, aber '.' fehlt, ist aber nicht leer. Welchen Unterschied macht das? Angesichts der Tatsache, dass beide einen fehlenden Wert zurückgeben, wenn sie in Vergleichsoperatoren verwendet werden, warum sollte ich mir dann die Mühe machen, Empty() als „Else“-Anweisung zu verwenden?
Dies verdeutlicht auch die Tatsache, dass, wenn die in der if-Anweisung getestete Bedingung „fehlend“ zurückgibt, diese weder wahr noch falsch ist, sodass die Schleife keine der beiden Anweisungen zurückgibt, was man immer im Hinterkopf behalten sollte!
Betreff: Warum immer eine else-Anweisung verwenden und der grundlegende Unterschied zwischen leeren und fehlenden WertenFWIW Ich verwende niemals eine ELSE-Anweisung, wenn ich keine ELSE-Bedingung habe.Hält meinen Code einfach und kompakt.Mir ist bewusst, dass if() eine Funktion ist und ich weiß, wie man sie als solche verwendet.Vielleicht ist es ein Überbleibsel aus anderen Sprachen, die ich verwendet habe.
Betreff: Warum immer eine else-Anweisung verwenden und der grundlegende Unterschied zwischen leeren und fehlenden WertenIch stimme zu, dass Computerprogrammierung im Allgemeinen und JMP-Scripting im Besonderen ernste Themen sind. Das Speichern von Skripten und das Zusammenhacken von von anderen geschriebenen Skripten bringt Sie nur begrenzt weiter. Die Folge sind meist Verwirrung und Frustration.
Es tut mir leid, dass unsere Ausbildung keine Option ist. Unser Einführungskurs ist ausgereift (ca. zwei Jahrzehnte) und wird gut angenommen. Mir ist kein anderes Training für JSL bekannt, weder kostenlos noch gegen Gebühr. Es gibt vielleicht einige kostenlose Videos, die bestimmte Themen behandeln, aber ich bezweifle, dass sie die Denkweise vermitteln. Normalerweise handelt es sich dabei um Anleitungen oder Kochbücher.
Vielleicht kennt ein anderes Community-Mitglied eine Schulung, die zu Ihnen passen würde.
Betreff: Warum immer eine else-Anweisung verwenden und der grundlegende Unterschied zwischen leeren und fehlenden WertenNun, ich möchte meine Kreativität auf keinen Fall durch eine einschränkende Denkweise einschränken. Ich schätze, mir fehlt wahrscheinlich die Ausbildung in diesem Bereich. Ich habe vor ein paar Monaten die Skripterstellung in JSL getestet, wobei ich mich hauptsächlich mit vorhandenen Skripten beschäftigt habe und mir den Skripterstellungsindex und die Skripterstellungsanleitung im PDF-Format angesehen habe. Jetzt denke ich, dass ich etwas Ernsthafteres brauche, wenn ich das Potenzial von JSL freisetzen möchte.
Kennen Sie (kostenlose) Online-Ressourcen zum Erlernen von JSL? Ich weiß, dass dies eine schwierige Frage sein kann, da Sie Mitarbeiter sind und Ihr Unternehmen kostenpflichtige Kurse anbietet, aber derzeit ist dies für mich keine Option.
Betreff: Warum immer eine else-Anweisung verwenden und der grundlegende Unterschied zwischen leeren und fehlenden WertenSie stellen einige große Fragen.
Mein grundlegender Punkt ist, dass, wie bei jeder Computerprogrammiersprache, die JSL-Syntax und -Redewendungen unsere Freunde sind, wir aber nicht ihre Sklaven sind. Meine Frage: „Was erwarten Sie?“ sollte lediglich darauf hinweisen, dass wir die Antwort auf diese Frage jedes Mal benötigen, wenn wir Code schreiben oder ändern. Eine klare Antwort macht den Unterschied in unserem Code aus.
Ja, Funktionen sind ein Schlüsselelement beim Schreiben von Skripten. Per Definition gibt jede Funktion ein Ergebnis zurück. Manchmal sind wir jedoch mehr an einem Nebeneffekt der Funktion interessiert als an dem zurückgegebenen Ergebnis. Beispielsweise gibt die V List Box()-Funktion einen Verweis auf das von ihr erstellte Anzeigefeldobjekt zurück. Ich interessiere mich möglicherweise mehr für die Box selbst (den Nebeneffekt) als für die Referenz.
Viele unerfahrene Skripter denken, dass If() und For() Anweisungen oder Befehle sind. Es sind Funktionen. Die Statement-Denkweise kann Ihre Kreativität einschränken. Die Denkweise ist wichtig. Das folgende Skript zeigt zwei Ansätze, um dasselbe zu erreichen, aber der zweite Ansatz würde jemandem mit einer Statement-Denkweise niemals in den Sinn kommen.
Names Default to Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
mean weight = Col Mean( dt:weight );
// assign within the If() function call
dt << New Column( "Condition 1", Numeric, Continuous );
For Each Row(
If( :weight < mean weight, dt:Condition 1 = -1, dt:Condition 1 = 1 );
);
// assign with the returned result from the If() function call
dt << New Column( "Condition 2", Numeric, Continuous );
For Each Row(
dt:Condition 2 = If( :weight < mean weight, -1, 1 );
);
Betreff: Warum immer eine else-Anweisung verwenden und der grundlegende Unterschied zwischen leeren und fehlenden WertenHallo Markbailey,
Danke für diese Einblicke
Tatsächlich fand ich es seltsam, Empty() als else-Anweisung verwenden zu müssen. Ich habe versucht, nach dem Beitrag zu suchen, in dem diese Vorgehensweise erwähnt wurde, kann ihn aber nicht mehr finden, sodass ich den Benutzer nicht fragen kann, warum er dies für nützlich hält.
Als Antwort auf Ihre Frage: Was versuchen Sie mit der bedingten If()-Funktion zu tun? Was erwarten Sie von der Rückkehr?
Nun, man vergisst leicht, dass JSL eine funktionsbasierte Sprache ist und Funktionen Werte zurückgeben. Daher verwende ich normalerweise nicht wirklich das, was die If-Anweisung zurückgibt. Ich habe dies nur untersucht, um die Grundlagen von JSL zu verstehen. In der Praxis frage ich mich, welchen Nutzen die Verwendung zurückgegebener Werte aus einer If-Anweisung hat?
Ich kann mir nur vorstellen, Platz in einem Skript zu schaffen oder es etwas schneller zu machen. Aber es fühlt sich so an, als ob, wenn ich versuchen würde, auf diese Weise schlau zu sein, es mich später noch einmal verfolgen und Fehler erzeugen würde.
Was ist Ihre Meinung dazu?
Betreff: Warum immer eine else-Anweisung verwenden und der grundlegende Unterschied zwischen leeren und fehlenden WertenIch verwende Is Empty(), um zu sehen, ob jemals eine Variable zugewiesen wurde.Dadurch wird ein Syntaxfehler vermieden für:
names default to here(1);
show(z);
Man kann überprüfen, ob die Variable „z“ jemals referenziert wurde:
Names Default To Here( 1 );
If( Is Empty( z ) == 0,
Show( z )
);
Ein besseres Beispiel ist das folgende.
Names Default To Here( 1 );
x=1;
If( x > 2, z = 7 );
If( Is Empty( z ) == 0,
Show( z )
);
Da es sich bei JSL um eine interpretierte Sprache handelt, folgt sie dem logischen Ablauf von JSL. Wenn also x <= 2, führt JSL z = 7 nicht aus (sieht es sich nicht einmal an) und daher ohne die Prüfung, ob z leer ist() ist erforderlich, da JSL einen Syntaxfehler auslösen würde.
In Ihrem Beispiel verwenden Sie eine andere Form der Zuweisung des Werts an z
names default to here(1);
z=(if(1>2, 7));
show(z);
Die Variable z nimmt den Wert 7 an, wenn 1 > 2, aber wenn nicht wahr, wird z nicht mehr zugewiesen, sodass sie den fehlenden Wert „.“ annimmt.Der Vorteil hierbei ist, dass JSL nach erfolgter Zuweisung die Variable z verarbeitet hat und kein Syntaxfehler auftritt, wenn später im Programmablauf auf z verwiesen wird.
Dies bringt uns zu der Frage, ob man Empty() als Ergebnis einer Rückgabe von false in einer If()-Funktion zuweisen sollte.
names default to here(1);
z=(if(1>2, 7, Empty()));
show(z);
Es kommt dann einfach darauf an, ob Sie z nicht als fehlenden Wert haben möchten und lieber nach „Is Empty()“ vs. „Is Missing()“ suchen möchten.Ich persönlich bevorzuge die Route mit fehlenden Werten, da sie Empty() als Bestätigung dafür hinterlässt, dass z nie zugewiesen wurde. .
Betreff: Warum immer eine else-Anweisung verwenden und der grundlegende Unterschied zwischen leeren und fehlenden WertenIch schreibe schon länger als die meisten Leute (1998). Ich bin Autor und unterrichte alle unsere Skriptkurse. Mir ist keine „Best Practice“ bekannt, die empfiehlt, immer ein Argument für die Bedingung „sonst“ einzufügen oder zu verwenden leer in Fällen, in denen es keinen bestimmten Rückgabewert gibt. Ich habe es auf jeden Fall nie verpasst oder dafür bezahlt, dass ich es nicht genutzt habe. Ich denke, dass dieses Problem ein weiterer Fall von „Es kommt darauf an“ ist. Was versuchst du mit der Bedingung zu machen? Wenn() Funktion? Was erwarten Sie von der Rückkehr?
Der Standardrückgabewert von Wenn() Funktion ist fehlen wenn das erste Argument als falsch ausgewertet wird und es nur zwei Argumente gibt. Sie haben dieses Verhalten mit dem in gespeicherten Wert demonstriert j . Der Wenn() Die Funktion verhält sich seit der Einführung von JSL in JMP 4 im Jahr 2000 so.
Sie können ein drittes Argument angeben Wenn() Funktion, die ausgewertet und zurückgegeben wird, wenn das erste Argument als falsch ausgewertet wird. Sie haben dieses Verhalten mit dem in gespeicherten Wert demonstriert z wo Sie das angegeben haben Leer() Funktion als drittes Argument.
Fehlen stellt einen unbekannten Wert dar. Am häufigsten handelt es sich um unbekannte Datenwerte oder um das Ergebnis der Auswertung eines unmöglichen numerischen Ausdrucks wie Log( -1 ). ich denke, dass fehlen ist als Standardrückgabewert für eine Bedingung, die nicht durch ein Argument dargestellt wird, sehr sinnvoll.
Leer ist genau das. Es repräsentiert den Zustand, in dem es nichts gibt. Zum Beispiel, wenn Sie anrufen Aktuelle Datentabelle() Ohne Argument wird zurückgegeben, wenn keine Datentabellen geöffnet sind leer .