| Lautsprecher |
Transkript |
| Jordan Hiller |
Hallo zusammen. Ich bin Jordan Hiller und in diesem Vortrag geht es um „Steal This Code! Drei Verbesserungen für Skripte aus dem erweiterten Logbuch“. |
| |
Und hier ist die Inspiration für diesen Vortrag: ein Buch von Abbie Hoffman, einem Provokateur und Aktivisten. Er nannte sein Buch „Steal this Book“, ein wirklich einprägsamer Titel. Ob das geschäftlich klug ist, sei dahingestellt, aber er ist auf jeden Fall sehr einprägsam. |
| |
Warum also diesen Code stehlen? JMP will, dass Sie Code stehlen. Die Idee ist, dass Sie per Mausklick Ihre Analyse in JMP durchführen. |
| |
Der Code hinter Ihrer Mausklick-Operation wird gespeichert. Er wird im erweiterten Protokoll gespeichert und kann abgerufen und wiederverwendet werden. |
| |
Und das sind etwa 90 % Ihres Produktionsskripts. Sie werden es sich schnappen und wiederverwenden, damit Sie |
| |
Automatisieren Sie häufige Aufgaben und erledigen Sie diese mit einem einzigen Klick anstatt mit einer Abfolge von Mausklicks. Genau darum geht es: Sie werden Zeit sparen. |
| |
Das Skript stammt aus dem erweiterten Protokoll und ist das Grundgerüst, das Skelett Ihres Produktionsskripts. |
| |
Etwa 10 % müssen Sie selbst schreiben, und genau darum geht es in diesem Gespräch. Wir werden über die verbindenden Elemente sprechen, die Drehbücher zusammenhalten. |
| |
In diesem Vortrag werde ich mich also mit Ihnen nicht so sehr auf die Details der Syntax konzentrieren. |
| |
Es geht viel mehr um das große Ganze, und das entspricht meiner Meinung nach einer guten Methode, JSL-Programmierung zu lernen. Es ist viel besser, bestehenden Code zu nehmen und anhand von Beispielen zu lernen. Nutze diesen Code. |
| |
Suchen Sie nach dem Code-Schnipsel, der das tut, was Sie möchten. Sie finden ihn in der JMP-Benutzer-Community oder vielleicht im Skripthandbuch. |
| |
Kopiere es einfach und passe es deinen Bedürfnissen an. Du musst nicht alle Feinheiten der Syntax kennen. Damit kommst du schon sehr weit. Die Syntax lernst du mit der Zeit durch Erfahrung. |
| |
Wir werden also drei Fallstudien besprechen, die zeigen, wie Sie Ihren Code anhand des erweiterten Logs verbessern können. Zunächst aber ein kurzer Überblick über JSL. Für einige von Ihnen mag dies eine Einführung in die JSL-Grundlagen sein. |
| |
Das Wichtigste, was du über JSL wissen solltest, wenn du anfängst, ist, dass alles ein Objekt ist. Alles, was du |
| |
Wenn man etwas mit einem Objekt machen möchte, umfasst das Datentabellen und Spalten in Datentabellen sowie Plattformen wie die Verteilungsplattform, den Graph Builder und Fit Y by X. |
| |
und die Berichte, die von diesen Plattformen stammen. Wenn Sie also Objekte haben, bearbeiten Sie diese, indem Sie ihnen Nachrichten senden. Objekte empfangen also Nachrichten. Hier ist ein sehr einfaches Beispiel, das ich aus dem erweiterten Protokoll kopiert habe. |
| |
Öffnen Sie die Datentabelle „Big Class“ im Beispieldatenverzeichnis und führen Sie eine einfache Verteilungsanalyse durch. Der entsprechende Code, direkt aus dem Protokoll kopiert, sieht folgendermaßen aus. |
| |
Jetzt. |
| |
Als Erstes möchten wir die Datentabelle benennen. Dazu habe ich den Code aus Zeile fünf übernommen und erweitert. |
| |
Ich habe `bctable=` vor dem Rest der Anweisung, also vor dem Öffnen, hinzugefügt. Dadurch wird beim Öffnen der Datentabelle der Name `bctable` erstellt. Ich habe `bctable` gewählt; in der Dokumentation wird `dt` verwendet. Sie können einen anderen Namen verwenden, die Zuweisung liegt bei Ihnen. |
| |
Markieren wir also die Datei und klicken auf die Schaltfläche „Ausführen“, öffnen wir BigClass und weisen ihr gleichzeitig den Namen „bctable“ zu. Der Vorteil dieser Vorgehensweise ist, dass ich nun Folgendes habe: |
| |
Das ist ein Hook, den ich später im Code verwenden kann, bctable. Wenn ich bctable sage, meine ich Big Class. |
| |
Also |
| |
Hier ist die nächste Zeile, der Verteilungsbefehl, den ich ebenfalls angepasst habe. Und wissen Sie, vorher war das laut Protokoll ein unveränderter Verteilungsbefehl. Er enthielt keine... |
| |
Es verweist nicht auf eine Datentabelle. Wenn Sie es auf diese Weise ausführen, führt JMP es einfach auf der Datentabelle aus, die den Fokus hat. |
| |
Die aktuelle Datentabelle ist zufällig eine große Klasse, da Sie sie kurz zuvor geöffnet haben. Okay. Es ist aber immer gut, explizit zu sein. Es empfiehlt sich, die zu bearbeitende Datentabelle genau anzugeben. Wir führen den Vorgang also auf diese Weise aus. |
| |
bctable, dann die Doppelpfeile und anschließend die Verteilungsbefehle. Das haben wir also hinzugefügt: bctable mit den Doppelpfeilen. |
| |
Und das ist die Syntax zum Senden einer Nachricht. Wir senden also die Verteilungsnachricht rechts an die Datentabelle links, nach der „bctable“ benannt ist. Wenn ich mit der Maus über „bctable“ fahre, sehe ich, dass es sich um Big Class handelt. Wenn ich das Ganze ausführe, |
| |
Wir erhalten den Verteilungsbericht. |
| |
das, was wir wollten. |
| |
Und jetzt können wir noch einen Schritt weitergehen, und das ist oft auch nötig. Wir werden der Plattform während des Betriebs einen Namen geben, also |
| |
Hier ist eine Zeile, die sowohl den Doppelpfeil als auch das Gleichheitszeichen enthält. Also, lesen wir sie von rechts nach links. Wir werden diese Verteilungsnachricht nehmen und sie an die BC-Tabelle senden. |
| |
Und das Ergebnis all dessen, also die Plattform, werden wir in dieser Variable namens distplat speichern. |
| |
Lass es uns versuchen. |
| |
Okay, sieht gleich aus, aber der Unterschied ist, dass ich jetzt diese JSL-Variable distplat habe, die ich später in meinem Code verwenden kann. |
| |
Wofür würden Sie es verwenden? Man könnte es beispielsweise verwenden, um rote Dreiecksoptionen zur Ausgabe hinzuzufügen. Also, hier ist es... |
| |
Lass uns den Verteilungsbericht dorthin bringen, wo du ihn einsehen kannst. |
| |
Und wir werden uns dieses Distplat-Objekt ansehen, das ist die...das ist die Vertriebsplattform. |
| |
Schauen Sie, wenn Sie mit dem Mauszeiger darüberfahren, lassen Sie uns diese Linie durchlaufen. Aktivieren Sie das normale Quintildiagramm in der Verteilungsplattform. Da ist es. |
| |
Okay. |
| |
Der letzte Schritt besteht darin, die Plattform zu nehmen, diesen Gegenstand hier zu nehmen und zu |
| |
Wir erhalten einen Bericht davon, ein Berichtsobjekt. Das ist diese Zeile. Senden Sie die Berichtsnachricht an das Plattformobjekt, und wir erhalten nun ein Berichtsobjekt. |
| |
Und das ist notwendig, wenn Sie in Ihrem Code auf diese Werte zugreifen möchten – also auf Zahlen, Diagramme oder grafische Elemente im Bericht. Sie benötigen dieses Objekt namens rdistplat. Führen Sie es also einfach noch einmal aus: rdistplat. |
| |
Ich habe es ausgeführt, und man sieht zwar nichts Auffälliges, aber jetzt habe ich dieses Objekt namens „rdistplat“. Es handelt sich dabei um ein Anzeigefeld, und wir werden später besprechen, wie man damit auf Zahlen im Bericht zugreifen kann. |
| |
Okay, ich werde mein Protokoll löschen. |
| |
und beginnen Sie mit unserem |
| |
Fallstudien. |
| |
Die erste Technik, die wir lernen werden, besteht also darin, denselben Befehl immer wieder auf verschiedene Spalten der Datentabelle anzuwenden, indem wir mit Schleifen und dem Befehl „for each“ über die Spalten iterieren. |
| |
Dies ist ein sehr häufiges Bedürfnis; manchmal handelt es sich nur um etwas Einfaches, das man tun muss, wie zum Beispiel das Format oder den Modelltyp einer Spalte zu ändern. |
| |
Es könnte sehr komplex sein, wie zum Beispiel |
| |
Man transformiert die Spalte, erstellt ein Kontrolldiagramm und analysiert dieses. Ja, die Technik ist skalierbar. |
| |
So erreichen wir das im JSL-Code. Wir klicken zunächst per Mausklick, führen die gewünschte Aktion aus, wenden sie auf eine einzelne Spalte an und extrahieren den Code anschließend mithilfe des erweiterten Protokolls. |
| |
Das ist also das Grundgerüst unseres Skripts. Wir werden es nun so anpassen, dass es alle Spalten durchläuft, auf die wir diese Aktion anwenden möchten. |
| |
Die Methode, die wir für Schleifen und Iterationen verwenden werden, ist `for each`. Diese Methode wurde in JMP 16 eingeführt, daher funktioniert diese Technik nicht in früheren Versionen von JMP. |
| |
Hierbei kommt auch ein Konzept namens JSL-Listen zum Einsatz, daher werden wir auch darüber kurz sprechen. |
| |
Okay, ich fange jetzt an. |
| |
In JMP beginne ich im Startfenster. |
| |
Und ich werde... lass mich kurz das Protokoll überprüfen, um sicherzustellen, dass es sauber ist. Nein, ich muss noch etwas entfernen, das Protokoll leeren. Okay, also wählen wir per Mausklick aus, was wir tun möchten. Ich öffne eine Datentabelle namens sc20. |
| |
Diese Datentabelle steht Ihnen in den Präsentationsmaterialien zur Verfügung, die Sie online finden. |
| |
Wenn man sich diese Datentabelle ansieht, hat sie eine ID-Spalte und dann ungefähr 20 Einträge. |
| |
Die Datenspalten enthalten sehr viele Dezimalstellen – zu viele, und ich möchte sie auf zwei Dezimalstellen kürzen. Ändern wir also das Format, sodass nur die ersten beiden Dezimalstellen angezeigt werden. |
| |
Das ist eine einfache Point-and-Click-Operation. Rechtsklick, Spalteninformationen aufrufen, |
| |
und wir werden das Anzeigeformat von der Standardeinstellung „Best“ auf „Dezimalzahlen mit zwei Nachkommastellen“ ändern. |
| |
Okay, und nachdem wir das nun für NPN1 erledigt haben, möchten wir das auch für 19 weitere Spalten tun. |
| |
Schauen wir uns also das erweiterte Protokoll an. |
| |
Und das ist es, der Code, den wir benötigen, um das Format der Spalte NPN1 zu ändern. Um ihn wiederzuverwenden, klicken Sie auf das rote Dreieck und speichern Sie das Skript entweder in der Zwischenablage oder in einem neuen Skriptfenster. |
| |
Ich werde nun zu einer anderen Datei wechseln, in der ich bereits etwas Arbeit geleistet habe, damit wir uns dem Ganzen etwas genauer widmen können. |
| |
Okay. |
| |
Die ersten beiden Zeilen hier... drei Zeilen, das ist der Code aus dem Protokoll. Okay, als Erstes öffnen wir die Datentabelle. |
| |
Und vielleicht ist Ihnen aufgefallen, dass ich ein wenig geändert habe, ich habe meinen langen Pfadnamen, meinen langen Verzeichnispfad zu dieser Datei, entfernt. |
| |
Wenn Sie es so ausführen, |
| |
Es funktioniert, solange sich die JMP-Datentabelle sc20 im selben Verzeichnis wie diese JSL-Datei befindet. Das entspricht also einem lokalen Dateipfad zu diesem Verzeichnis, in dem Sie sich gerade befinden. |
| |
Also, aus dem Protokoll geht hervor, dass wir gerade die Datentabelle öffnen und dann hier die Formatänderung anwenden: Festkommazahl, 10 Zeichen, zwei Dezimalstellen. |
| |
Die Spaltenreferenz hier links ist eine Möglichkeit, eine Spalte anzugeben. Es gibt verschiedene Möglichkeiten, aber diese ist eine sehr gebräuchliche, die Sie mit dem Doppelpunkt sehen werden. Tabellenreferenz links vom Doppelpunkt und Spaltenname rechts davon. |
| |
Dies ist also wieder direkt aus dem Protokoll. |
| |
JMP verwendet diese Methode im Log, um die Datentabelle zu adressieren. Ich denke, es ist besser, wie besprochen, den JSL-Namen beim Öffnen anzugeben und diesen dann im weiteren Verlauf zu verwenden. Daher habe ich den Eintrag vor dem Doppelpunkt durch „dt“ ersetzt. |
| |
Hier ist also derselbe Code, nur... ein bisschen korrigiert, und wenn ich ihn ausführe, ja, dann funktioniert er wie gewünscht. Er öffnet die Datentabelle und... |
| |
Das Format wird auf zwei Dezimalstellen geändert. Okay, ja, jetzt, wo wir das haben, ist es ganz einfach. |
| |
Ändern Sie alle 19 anderen Spalten, richtig. Da... hier ist NPN1, und dann kann ich diese Zeile einfach kopieren, alle Werte ändern und das Ganze 19 Mal wiederholen. |
| |
Ja, natürlich ist das ineffizient, und einer der großen Vorteile der Programmierung ist ja, dass man etwas nicht mehrfach machen muss. Dadurch wird die Wartung deutlich einfacher, wenn wir den Code nur einmal schreiben, anstatt ihn 19 oder 20 Mal zu schreiben. |
| |
So gehen wir dabei vor. Zuerst erstellen wir eine Liste aller Spalten, mit denen wir arbeiten möchten. |
| |
Und wenn ich von einer Liste spreche, meine ich nicht einfach irgendeine Liste. Ich spreche von einer JSL-Liste, also von einer speziellen Datenstruktur, die man beim Programmieren in JSL verwendet. |
| |
Eine Liste besteht aus einigen Objekten in einem Container, und genau so verwenden wir sie. Hier sind drei Möglichkeiten, eine Liste von Spaltenobjekten zu erstellen. |
| |
Die erste Möglichkeit besteht darin, es manuell zu machen, also alles einzutippen. Wenn ich das also ausführen würde, |
| |
drei Tabellenverweise...drei Spaltenverweise, NPN1, PNP1, PNP2. |
| |
Beachten Sie die geschweiften Klammern sowohl in meinem Code als auch beim Überfahren der CNames-Variable mit der Maus. Anhand dieser geschweiften Klammern erkennen Sie, dass Sie in JSL mit einer Liste arbeiten. |
| |
Okay, das ist also eine Möglichkeit, eine Liste zu erhalten. Schauen wir uns noch ein paar andere Möglichkeiten an. Diese hier werden wir letztendlich für dieses Beispiel verwenden. |
| |
Sag: „Hey, hol dir alle zusammenhängenden Spalten in meiner aktuellen Datentabelle, also in der Datentabelle, die ich hier dt nenne.“ Also: Nachrichtenobjekt, erstelle eine neue Liste. |
| |
Dann lasst uns dieses Spiel spielen. |
| |
Wenn ich jetzt mit der Maus über CNames fahre, sehen Sie, dass wir genau das brauchen. Das ist die Liste aller 20 Einträge, die wir bearbeiten möchten. |
| |
Okay, und die letzte Möglichkeit besteht darin, den Benutzer die Spalten in der Datentabelle auswählen zu lassen. Das sieht dann so aus. Ich wähle einfach zwei aus. Nehmen wir IVP und PNP4, also zwei Spalten. |
| |
Und wenn ich das ausführe, |
| |
Wir erhalten eine Liste, die nur diese beiden ausgewählten Spalten aus der Datentabelle enthält. |
| |
Okay, wie auch immer Sie diese Liste erhalten, der nächste Schritt besteht darin, diese Formatierungszeile auf jedes Element in der Liste anzuwenden, und das nennt man Schleife oder Iteration. |
| |
Hier ist also die alte Methode. Sie verwendet den Befehl „for“ in JMP. So ging man vor JMP 16 vor, und ich habe sie hier zur Erinnerung aufgeführt, falls Sie noch JMP 15 verwenden. Aber, |
| |
Wissen Sie, die Suche nach neuen Benutzern ist etwas kompliziert und abschreckend. Daher gibt es eine viel kompaktere und lesbarere Möglichkeit, wenn Sie in JMP 16 eine Liste verwenden. Wenn ich eine Aktion für jedes Element einer Liste wiederholen möchte, kann ich dies für jeden Befehl verwenden. |
| |
Okay, schauen wir uns das mal an und sehen wir, was es macht. Es benötigt drei Argumente, die durch Kommas getrennt sind; wir gehen sie von rechts nach links durch. |
| |
Das letzte Argument ist der Formatierungsbefehl, richtig, der das Format anwendet, und anstatt dies für dt NPN1 zu tun, anstatt es für eine Spalte zu tun, habe ich hier einen Platzhalter eingefügt und Listenelement ausgewählt; Sie wählen, was Sie möchten. |
| |
Okay, das ist nur ein Wort, ein Variablenname, den Sie selbst wählen. Ich habe „Listenelement“ gewählt. Das ist also unser Platzhalter, und das ist der Befehl, den wir für jedes Element der Liste ausführen möchten. Welche Liste? Diese Liste, okay. Das ist also unsere Liste, das ist die zweite. |
| |
Argument. Und das erste Argument ist der Platzhalter, richtig? Es teilt uns mit, dass wir diesen Platzhalter verwenden, um die Werte der Elemente in der Liste zu speichern. |
| |
Es steht in geschweiften Klammern, also achte darauf, dass du diese verwendest, wenn du diesen Code wiederverwendest. |
| |
So sieht das Ganze also aus: Anstatt über 20 Codezeilen habe ich nur drei, und das beinhaltet auch das Öffnen der Datentabelle. |
| |
Zuerst wird eine Liste der Spaltennamen erstellt und dieser Vorgang für alle 20 aufeinanderfolgenden Spalten wiederholt. Um den gesamten Vorgang auszuführen, sehen Sie, wie er aussieht. |
| |
Und da ist es. |
| |
hat zwei Dezimalstellen im Format. |
| |
Okay, das war also ein sehr einfaches Beispiel für die Verwendung der for each-Schleife, um etwas sehr Einfaches zu tun. |
| |
auf einer Säule. |
| |
Ich möchte Ihnen ein etwas interessanteres Beispiel zeigen. |
| |
Hier ist ein Beispiel, bei dem für denselben Datensatz, für sc20, |
| |
Ich werde für jede Spalte ein Kontrolldiagramm erstellen und diese Kontrolldiagramme einem Journal hinzufügen und das Ganze als PDF speichern, okay? |
| |
Es verwendet dieselbe Schleife für jedes Element und hat dieselben ersten beiden Argumente: das Listenelement als erstes und den Listennamen als zweites. Jetzt habe ich aber jede Menge Code als drittes Element – als drittes Argument in der Schleife für jedes Element. |
| |
So, los geht's. Führen wir das gesamte Skript aus. |
| |
Ich habe eine Reihe von Kontrollkarten erstellt und sie in einem Journal zusammengetragen. Und jetzt, wenn ich auf meinen Desktop schaue, sehe ich dieses Dokument, meinen Bericht (report.pdf), der all diese Kontrollkarten enthält – Seite eins, mit den dazugehörigen Seitenumbrüchen. Also Seite eins, Seite zwei, Seite drei. |
| |
Sie können sich dieses Beispiel also auch in Ihrer Freizeit ansehen. Es ist in den Präsentationsunterlagen enthalten. |
| |
Okay, das war also die erste Technik, die wir besprochen haben. Räumen wir das Protokoll für die nächste Technik auf. |
| |
Okay, einen Wert aus einem Bericht extrahieren. Das kommt in JSL häufig vor. Man führt eine Analyse durch, vielleicht eine Verteilungsanalyse, vielleicht eine Regressionsanalyse, und man muss… |
| |
Man kann etwas daraus gewinnen, irgendetwas sammeln. Vielleicht ist es der Mittelwert oder der Median. Vielleicht ist es ein Steigungskoeffizient aus der Regression oder ein p-Wert. |
| |
Das ist also unsere Aufgabe, und die Schwierigkeit dabei ist, dass Berichte eine hierarchische, stark verschachtelte Struktur haben. Es kann daher etwas knifflig sein, sich in dieser Hierarchie, in diesem Baum, zurechtzufinden, um genau das zu finden, was wir suchen. Deshalb zeige ich Ihnen einen Trick. |
| |
Der Trick besteht darin, dass wir uns wie üblich per Mausklick durch die Analyse navigieren und dann das, was wir uns heraussuchen wollen, |
| |
Ich werde die Textfarbe auf Rot ändern, nur eine kleine Formatierungsänderung. Und wenn wir das Skript dann im Protokoll speichern, werden wir es verwenden, um zu erfahren, wie wir auf das rote Element zugreifen. |
| |
in JSL. Gehen wir das also gemeinsam durch. |
| |
Wieder zurück in JMP. |
| |
Ich öffne jetzt Big Class, das gute alte Big Class, und lasse uns eine Verteilung auf der Spalte „Höhe“ durchführen. |
| |
Okay, hier ist mein Verteilungsbericht, aus dem ich etwas extrahieren möchte. Nehmen wir an, es ist der Median, in diesem Fall ist der Median 63, und ich werde ihn in einer JSL-Variablen speichern, damit ich ihn später wiederverwenden kann, beispielsweise zum Schreiben von Code oder für Berechnungen. |
| |
Hier ist der Trick, um herauszufinden, wie man mit der Zahl 63 umgeht. |
| |
Ich möchte die Farbe, die Schriftart oder was auch immer von dem Objekt ändern, das ich greifen möchte. Falls Sie das noch nie gesehen haben, ist es gut zu wissen, wie das geht. |
| |
Es gibt eine Schaltfläche in der Symbolleiste für Eigenschaften; ich glaube, das ist eine neue Schaltfläche in JMP 16. |
| |
Wenn Sie also die Eigenschaften für diesen Bericht aktivieren. |
| |
Wir können diesen Baum entlanggehen und finden, was wir brauchen. Schau dir das an. |
| |
Nummerierte Spalte, rechts. Und beachten Sie, dass sich beim Klicken auf verschiedene Teile des Berichts die entsprechenden Spaltenüberschriften ändern. |
| |
Im Eigenschaftenfenster wird der Artikel, genauer gesagt die Art des Anzeigefelds, hervorgehoben. |
| |
Okay, wir können also sehen, dass dieses Element, das all diese Ergebnisse enthält, eine Zahlenspalte mit all diesen Zahlen darin ist, und, wie ich Ihnen bereits gesagt habe, werden wir dieses Element einfach nehmen, und ich werde die Textfarbe auf Rot ändern. |
| |
Einfach so. |
| |
Jetzt schließe ich das Eigenschaftenfenster. |
| |
Hier ist der Bericht, und senden wir dieses Skript an das erweiterte Protokoll. |
| |
Rotes Dreieck: Skript im Protokoll speichern. |
| |
Und nun schaue ich mir das Protokoll an. |
| |
Das ist der Teil, den wir brauchen. Er enthält den Verteilungsbefehl, der die Textfarbe des Medians und anderer Statistiken auf Rot ändert. Schauen wir uns das jetzt etwas genauer an. |
| |
Okay, hier ist also der Code... derselbe Code wie im erweiterten Log. Ich habe ihn einfach hierher kopiert und etwas formatiert, damit wir besser darüber sprechen können, was wir brauchen. |
| |
Der Hauptgrund dafür war also, diesen Teil zu erhalten, den wir jetzt interpretieren werden. Er verwendet „send to report“ und darin „dispatch“. |
| |
Und wir werden uns hier wirklich auf die vier Argumente für den Versand konzentrieren. Die ersten drei benötigen wir, das vierte Argument ist die Farbänderung, aber das interessiert uns nicht wirklich. Wir wollen die Anzeigebox ansprechen, das Element, das wir benötigen, okay? |
| |
Das erste Argument betrifft die Navigation. Es sagt uns: Gehen Sie zu „Anzeigefelder“, das sind eigentlich Rahmenfelder, gehen Sie zu „Rahmenfelder“. |
| |
Hier. Schauen wir uns also diesen Bericht an. Sicherlich ist Ihnen in JMP aufgefallen, dass Berichte verschiedene Verschachtelungsebenen haben, richtig? Und ich habe hier nur eine... |
| |
Eine äußere Umrissboxverteilung. Darin befindet sich eine Umrissboxhöhe und darin wiederum eine Umrissboxquantilen, und innerhalb dieser Quantile befindet sich das, was ich extrahieren muss. |
| |
Das ist also die Aussage. Es bedeutet, dass ich den Baum hinuntergehen soll. Ich brauchte nur die Höhe und die Quantile, und das wird uns helfen, ihn zu identifizieren. |
| |
Gut. Die nächsten beiden Argumente geben uns Aufschluss über dieses Element, das wir rot markiert haben. Das dritte Argument beschreibt es: Es handelt sich um ein Zahlenspaltenfeld, das wir bereits in den Eigenschaften gesehen haben. |
| |
Und das zweite Argument liefert uns den Titel. |
| |
Dieses Feld mit der Zahl ist leer. Es hat keine Überschrift, und das ist in Ordnung. Wir können diese Informationen trotzdem nutzen, um an die Daten zu gelangen. Manchmal wird hier also eine Überschrift angezeigt, manchmal nicht. |
| |
Okay, jetzt, wo wir das haben, werden wir diese Informationen nutzen. |
| |
um den Median zu ermitteln. |
| |
Hier ist der Code, der das erledigt. Er beginnt hier in Zeile 23 und geht bis Zeile 29. |
| |
Wir öffnen die Datentabelle erneut. |
| |
Benennung der Verteilung, Durchführung der stetigen Verteilung. |
| |
Sie werden feststellen, dass wir keine dieser Dispatch- und Send-to-Report-Anweisungen haben; das liegt daran, dass wir es in unserem Produktionsskript nicht rot färben müssen. |
| |
Also ja, führe die Vertriebsanalyse durch und nenne die Plattform. |
| |
Das ist wichtig, Sie müssen... Sie greifen auf die Berichtsebene zu. Sie extrahieren sie mit dieser Zeile, wodurch rdist, dieses Berichtsobjekt, erstellt wird. |
| |
Und genau hier geschieht die Magie. Hier setzen wir an. |
| |
Wir speichern den Medianwert in der JSL-Variablen „mdn“ und schreiben ihn ins Log. Ich erkläre Ihnen das gleich genauer, aber zunächst führen wir das Ganze einmal aus, damit Sie sehen, was passiert. |
| |
Ich wollte Zeile 23 ausführen, hoppla, machen wir es lieber so. Führen wir die Zeilen 23 bis 29 aus. |
| |
Die Verteilung wurde durchgeführt. Sie ist nicht rot, und wir haben den Median extrahiert. Dieser ist nun in mdn gespeichert; der Wert für diese Variable beträgt 63. |
| |
Der Median liegt bei 63. Perfekt. |
| |
In Ordnung. |
| |
Hier ist also die Zeile, aus der wir die Daten extrahieren. |
| |
Der Medianwert, also die Zahl 63 aus dem Bericht. |
| |
Schauen wir uns das mal an. Ich rufe das einfach mal hier auf, damit wir… |
| |
Beziehen Sie sich darauf, wie wir es tun. |
| |
Hier ist also diese Zeile. Sie ist nur wieder so organisiert, dass wir jedes Element einzeln betrachten können. |
| |
63, der Medianwert aus dem Bericht. |
| |
So gelangen wir dorthin. |
| |
Dies nennt man Indizierung. Wenn Sie in JSL-Code eckige Klammern sehen, bedeutet das, dass Sie ein Objekt indizieren. Dieses Objekt ist ein Container, beispielsweise ein Anzeigefeld. |
| |
Oft handelt es sich um eine Liste. Listen lassen sich auf diese Weise auch indizieren. Wir extrahieren also verschachtelte Elemente aus diesem Berichtsobjekt. |
| |
Als Erstes schauen wir uns das Höhenumrissfeld an. Erinnern Sie sich daran? Und dann gehen wir von dort aus zum Quantilfeld über, auch daran erinnern Sie sich. |
| |
Und jetzt sind wir am richtigen Ort. Wir müssen uns nur noch das nehmen, was wir brauchen, nämlich das Zahlenspaltenfeld, richtig? Und weil es das nicht hatte… |
| |
Wir könnten einen Titel verwenden (das war das, was hier oben stand, ohne Titel), stattdessen beziehen wir uns auf die Nummer. Es ist das erste Zahlenfeld in der Quantils-Übersicht. |
| |
Man könnte sich das ansehen und denken: „Moment mal, hier sind ja Zahlen. Das ist doch auch eine Zahlenspalte, oder?“ Nein, tatsächlich nicht. Es ist eine Zeichenkettenspalte. Und denken Sie daran: Sie können all das überprüfen, wenn Sie möchten. Das sind, wie gesagt, die Eigenschaften. |
| |
Und wenn ich hier klicke, |
| |
Zahlenspalte, Zeichenkettenspalte, Zeichenkettenspalte. Sehen Sie sie hier? Zeichenkette...Zeichenkettenzahl, also ist es die erste Zahlenspalte. |
| |
Und das wird all diese Zahlen erfassen. |
| |
Okay, als allerletztes müssen wir noch diesen Index einfügen. Durch das Einsetzen eines Index wird das sechste Element ermittelt: 1, 2, 3, 4, 5, 6. Das ist der Median; er beträgt 63. Wenn wir diese Zeile ausführen, wird der Bericht mit diesem Index versehen; der Median wird erfasst, sodass wir ihn später wiederverwenden können. |
| |
Hier ist also eine Anleitung, wie man etwas aus einem Bericht extrahiert. Ich habe noch ein weiteres Beispiel, das ich in den Präsentationsunterlagen vorstellen werde. |
| |
Ein Element, das einen Titel hat und den Sie sehen können, können Sie als Vorlage verwenden, um Ihre eigene Arbeit daran zu gestalten, falls Sie auf diese Situation stoßen. |
| |
Okay, als Letztes werden wir besprechen, wie man Eingaben vom Benutzer, also der Person, die das Skript ausführt, erhält. |
| |
Und lassen Sie sie selbst entscheiden, welche Datei oder sogar welche Spalte in der Datentabelle sie analysieren möchten. Das ist wohl die gängigste Methode. |
| |
Etwas, was angehende Skriptersteller gerne tun möchten. Ich habe mein Skript so eingerichtet, dass es in einer Spalte etwas ausführt, und möchte anderen Personen in meiner Organisation etwas zur Verfügung stellen. |
| |
Damit sie es selbst mit anderen Daten ausprobieren können, richtig? Wenn Sie Ihre Skripte also auf diese Weise verallgemeinern, sodass Ihre Benutzer entweder eine Datei oder eine Spalte oder beides auswählen können, |
| |
Sie verallgemeinern Ihr Skript und steigern so dessen Wert erheblich. Sie können es anderen Mitarbeitern in Ihrem Unternehmen zur Verfügung stellen. Diese können Ihre Arbeit reproduzieren und sie schnell erledigen, ohne jeden Klick einzeln ausführen zu müssen. |
| |
Okay, in diesem Abschnitt geht es weniger um eine Fallstudie als vielmehr um eine Liste. Ich zeige Ihnen drei Methoden, mit denen Ihre Benutzer Dateien auswählen können, und zwei Methoden, mit denen sie Spalten auswählen können. |
| |
Wir beginnen mit den Methoden zur Dateiauswahl. Wie üblich starten wir mit einem Eintrag im Log und kopieren diesen anschließend. So sieht es aus, wenn man Big Class öffnet; im Log erscheint dann folgender Eintrag: „Big Class öffnen“. |
| |
dt. Ich verwende in diesem Fall dt, und wenn ich also Big Class öffne, |
| |
Jetzt zeigt es auf Big Class, okay. Und dann würde ich mit meinem Produktionsskript fortfahren, richtig? |
| |
Folgendes ist wichtig: Um dem Benutzer die Wahl der gewünschten Datei zu ermöglichen, müssen wir lediglich einen Weg finden, dt auf etwas anderes verweisen zu lassen. |
| |
Schreiben Sie den Rest Ihres Skripts, verwenden Sie dt, und dann können Sie dies am Anfang ändern. dt zeigt nicht mehr nur auf Big Class; es wird auf etwas anderes zeigen. |
| |
Okay, und das ist etwas anderes, das vom Benutzer bestimmt wird. |
| |
Die Person, die das Skript ausführt. Okay, ich denke, das Einfachste ist, dass Sie diese Zeile verwenden können, anstatt eine Datentabelle zu öffnen. Wenn Sie diese Zeile am Anfang Ihres Skripts verwenden, um dt zuzuweisen, |
| |
Das bedeutet, dass JMP dieses Skript ausführt und den entsprechenden dt-Wert liefert. |
| |
Benennen Sie die jeweilige Datentabelle, die davor steht. |
| |
Aus Benutzersicht öffnet man also eine Datentabelle, ich öffne hier sc20, und erstellt sc20 |
| |
Meine aktuelle Datentabelle. Sehen Sie das hier oben? Das, was in diesem Fenster angezeigt wird, ist die aktuelle Datentabelle. |
| |
Wenn Ihr Benutzer also eine Datentabelle öffnet, dann das Skript ausführt und dann auf diese Zeile stößt, zeigt dt nun auf sc20. |
| |
Das ist also eine ziemlich leistungsstarke Methode. Das Problem dabei ist, dass der Benutzer genau wissen muss, was zu tun ist. Er muss wissen, dass er zuerst die Datendatei öffnen und dann das Skript ausführen muss. |
| |
Wir können das etwas robuster gestalten. Wir können ihnen beim Ausführen des Skripts einen Dateiauswahldialog anzeigen, damit sie durch ihre Verzeichnisstruktur navigieren und die richtige Datei zum Öffnen finden können. |
| |
Es stellt sich heraus, dass das kinderleicht ist. Man entfernt einfach alles, was hier steht, streicht den Bezug zu „Big Class“ und sagt einfach ohne weitere Erklärung „offen“. |
| |
Und wenn JSL versucht... wenn JMP versucht, diese Zeile zu interpretieren, sagt es: „Okay, der Benutzer möchte etwas öffnen, aber ich habe keine Ahnung, was. Zeigen wir ihm einen Dateiauswahldialog, damit er entscheiden kann.“ |
| |
Also los... lasst uns das ausführen. dt = open. |
| |
Führen Sie das Skript aus. Hier ist Ihr allgemeiner Dateiauswahldialog, und von meinem Desktop aus öffne ich Iris. |
| |
Iris ist geöffnet und trägt natürlich den Namen dt. |
| |
Alle JMP-Dateien, alle Dateien, richtig. Hier könnten viele Daten angezeigt werden. |
| |
Wenn Sie also mehr Kontrolle benötigen, äh, wenn Sie mehr Kontrolle benötigen über |
| |
Die Auswahlmöglichkeiten, die Ihr Benutzer treffen wird, werden wir anstelle der Option "Öffnen" verwenden. Stattdessen verwenden wir die Option "Datei auswählen". |
| |
Der Befehl „Datei auswählen“ bietet verschiedene Optionen. Ich verwende nur drei davon. |
| |
Gehen wir dieses Beispiel durch. Die ersten drei Argumente für „Datei auswählen“ sind der Titel, der im Auswahlfenster angezeigt wird, |
| |
Ein Verzeichnis, in dem die Dateiauswahl startet, und ein Filter, der angibt, welche Dateien über diese Auswahl geöffnet werden können, richtig? Führen wir also diese Zeile, diesen Codeabschnitt, den Befehl „Datei auswählen“ aus und speichern das Ergebnis in PF. |
| |
Lass das laufen. |
| |
Okay, beachten Sie, dass es sich hier um dieses Argument handelt, wählen Sie die Excel-Datei aus. Das sehen wir hier oben im Fenstertitel. |
| |
Der Ordner, der Pfad im zweiten Argument, das ist der Ausgangspunkt. |
| |
Und der dritte Teil, der Dateifilter, der festlegt, dass dem Benutzer nur Excel-Dateien zum Öffnen angezeigt werden, befindet sich hier unten. Ich darf nichts anderes als Excel-Dateien anzeigen. Ich bin auf Excel-Dateien beschränkt. |
| |
Sagen wir also „Sandwiches“ und klicken auf „Öffnen“. |
| |
Moment mal, warum ging es nicht auf? |
| |
Gut, schauen wir mal nach. PF bedeutet „Datei auswählen“. Was ist PF? Ah, PF ist der Pfad zu der Datei, die wir öffnen wollen. Wir haben den Befehl zum Öffnen noch nicht ausgeführt. „Datei auswählen“ öffnet keine Datei, es wählt sie nur aus. |
| |
Um den Kreis zu schließen, müssen wir Folgendes tun: Erstellen Sie unsere Tabellenreferenz, indem Sie die |
| |
PF-Variable, die auf die gewünschte Datei, die gewünschte Excel-Datei, verweist. |
| |
Da ist es. Damit öffnet sich die Datentabelle für die Sandwiches, und jetzt habe ich meine dt-Tabelle und kann mit meinem Skript fortfahren, genau wie ich es wollte. |
| |
Lassen Sie mich kurz innehalten, um Ihnen etwas Wichtiges zu zeigen. Wählen Sie „Datei“, falls Sie auf etwas Ähnliches stoßen und nicht alle Argumente kennen, aber mehr darüber erfahren möchten. Ein paar Dinge: Zunächst einmal erhalten Sie ein wenig |
| |
Wenn Sie mit der Maus über „Hilfe“ fahren, öffnet sich ein kleines Popup mit Informationen zur Syntax. Hier ist eine bessere Option: Klicken Sie mit der rechten Maustaste im Skriptfenster darauf. |
| |
Und Sie können es im Skriptindex nachschlagen. Der Skriptindex ist ein sehr wichtiges Werkzeug für jeden JSL-Programmierer, und |
| |
Es enthält den gesuchten Befehl. Es enthält die Liste der Argumente, einen erläuternden Text und – besonders wichtig – einige Beispiele, die Sie durchgehen können, um die Funktionsweise zu verstehen. Wenn ich also dieses Beispiel hier ausführe, erhalte ich eine Pick-Datei. |
| |
Nun ja, es hat mich an einen Ort geführt, an den ich nicht will. |
| |
Schließen wir es einfach. |
| |
Okay, und dann können wir experimentieren und diesen Code schnappen, diesen Code stehlen und ihn in unserem...in unserem Skript verwenden, wenn wir wollen. |
| |
Okay, das ist das Skriptindex. Es ist auch über das Hilfemenü erreichbar. Skriptmenü... schau mal da oben nach. |
| |
Die aktuelle Datentabelle, ein unstrukturiertes Öffnen oder eine Auswahldatei. Es gibt auch andere Möglichkeiten, aber das sind drei gute Ausgangspunkte. |
| |
Kommen wir nun dazu, wie Sie Ihren Benutzern die Möglichkeit geben können, die Spalte auszuwählen, mit der sie arbeiten möchten. |
| |
Hier bin ich... Ich habe etwas aus dem Protokoll kopiert. Ich habe eine Datentabelle namens „Preise“ geöffnet und darin ein Diagramm erstellt, das den Preisverlauf von Äpfeln im Zeitverlauf zeigt. |
| |
Ich zeige Ihnen jetzt nicht die Point-and-Click-Funktion, sondern führe einfach das Skript aus. Ich denke, Sie wissen bereits, wie man Skripte aus dem erweiterten Protokoll extrahiert. Schauen wir uns also an, was das Skript macht. Es öffnet die Preisliste und zeigt mein Diagramm: Äpfel im Vergleich zum Datum, Preisentwicklung der Äpfel im Zeitverlauf. |
| |
Schauen Sie sich diese Datentabelle an, Preise, ja, da sind Äpfel, aber ich habe auch all diese anderen Produkte, richtig? Was wäre, wenn ich dem Benutzer die Möglichkeit geben möchte, mir mitzuteilen, welches Diagramm er sehen möchte, welche Spalte er grafisch dargestellt sehen möchte? |
| |
Genau darum geht es in diesem Abschnitt: den Nutzern die Wahl zu lassen. |
| |
Okay. |
| |
Wir werden also zwei Methoden besprechen. Hier ist die erste. |
| |
Es arbeitet mit den vom Benutzer ausgewählten Spalten. |
| |
Und das haben wir schon einmal gesehen, diese Syntax haben wir, glaube ich, in unserer zweiten Fallstudie kennengelernt. Ja, so erstellen wir eine Liste. |
| |
Diese Tabelle enthält die in der Datentabelle ausgewählten Spalten. Ich kehre also zu dieser Datentabelle zurück. |
| |
Ich werde vielleicht drei Spalten auswählen und |
| |
Lass uns rennen |
| |
Das. Eigentlich sollte ich dt ausführen. Lass uns beide ausführen. |
| |
Hühnchen, Kaffee und Eier. |
| |
In Ordnung. |
| |
Also. |
| |
Welches Element möchte ich bearbeiten? Nun, Sie wissen ja, wie man arbeitet, wie man eine Liste mit einer Schleife durchläuft, aber das machen wir jetzt nicht. Ich verwende einfach eine Abkürzung. Ich sage: Schauen Sie, |
| |
Wenn der Benutzer mehrere Optionen ausgewählt hat, soll nur die erste Option grafisch dargestellt werden. Der Benutzer hat also vor dem Ausführen des Skripts Huhn, Kaffee und Eier ausgewählt. Ich möchte ihm nur die Grafik für Huhn anzeigen. |
| |
Okay, das ist also die nächste Zeile. Hier erfolgt die Indizierung. Wir indizieren die CNames-Liste, um das erste Element zu erhalten. |
| |
Wir werden das also durchführen. |
| |
Jetzt habe ich diese schöne Variable, meine Spalte. |
| |
die den ersten Eintrag aus der Liste, Huhn, und die Spaltenreferenz mit dem Doppelpunkt enthält. |
| |
Und jetzt können wir unseren Graphgenerator ausführen. Jetzt können wir mit unserem Leben weitermachen, der einzige Unterschied besteht darin, dass wir hier oben anstelle von Äpfeln Folgendes verwendet haben: |
| |
Das ist jetzt meine Spalte. Das ist die einzige Änderung, die wir vorgenommen haben, und wenn wir das jetzt ausführen, erhalten wir ein Diagramm über den Hühnerpreis. |
| |
Gut. |
| |
Okay, das ist also eine Möglichkeit, aber wie bereits erwähnt, setzt dies voraus, dass der Benutzer weiß, was er zu tun hat. Das erfordert... |
| |
Diese Methode erfordert, dass der Benutzer weiß, dass er die Datentabelle öffnen, dies auswählen und dann das Skript ausführen muss, und das ist etwas umständlich. |
| |
Stattdessen ist es etwas robuster, dem Benutzer zur Laufzeit einen Spaltenauswahldialog anzuzeigen. So sieht das aus. Die Syntax ist etwas komplex. Ich werde nicht auf alle Details eingehen, sondern es allgemein erläutern. Wir öffnen die Datentabelle wie zuvor. |
| |
Wir verwenden diesen Befehl namens Spaltendialog. |
| |
um dem Benutzer eine Auswahlmöglichkeit anzuzeigen...Spaltenauswahl für den Benutzer. |
| |
Es gibt viele Argumente dafür. Ich verwende nur ein paar davon. Ich sage: „Hey, gebt mir einen Button mit der Aufschrift ‚Produkt auswählen‘, und der Benutzer kann maximal eine Spalte auswählen, muss aber mindestens eine auswählen.“ |
| |
Also, lasst uns dieses Skript ab Zeile 60 ausführen. |
| |
Eröffnungspreis, hier ist mein Dialog – und sehen Sie, was für ein umfangreicher Dialog das mit so wenig Code ist! Das ist der Vorteil dieses Spaltendialogs, den wir verwenden. Ich wähle also Kaffee aus und klicke auf OK. |
| |
Gut. Zurück zum Skript, wir haben diese Zeile gerade ausgeführt. |
| |
Das Ergebnis unserer Auswahl wird in dlg gespeichert. Schauen wir uns das einmal an. |
| |
Okay, das ist etwas kompliziert. Es heißt, dlg sei eine Liste, siehe die geschweiften Klammern, und ich habe verschachtelte geschweifte Klammern, es ist also wie verschachtelte Listen. |
| |
Hier ist die Indizierung, die Sie dorthin bringt. Ich werde das nicht lange erklären, aber Sie können diesen Code kopieren, falls Sie das benötigen. Um also aus einem Dialog nur den Teil zu erhalten, der „Kaffee“ sagt, also eine Spaltenreferenz zu „Kaffee“, … |
| |
Hier ist die Tiefstellung, um meine Spalte zu erstellen, also führen Sie diese Zeile aus. |
| |
Und nun enthält meine Spalte nur noch diesen Verweis auf die Kaffeespalte, und das ist identisch mit vorher. Wir führen den Graph-Builder mit folgendem Befehl aus: |
| |
Ich verwende stattdessen Cola anstelle von Äpfeln, und so erhalten wir Kaffee oder was auch immer der Benutzer ausgewählt hat. |
| |
Okay, das war alles, was ich euch mitteilen wollte. Zum Schluss möchte ich euch noch einen kleinen Tipp geben, falls ihr auf diese Weise mit der JSL-Programmierung anfangen wollt. |
| |
Der Rat lautet also: Lassen Sie JMP Ihren Code so weit wie möglich automatisch schreiben. Und genau dafür ist das erweiterte Protokoll da: um den Code aus dem Protokoll zu extrahieren. Das ist der größte Teil Ihres Skripts. |
| |
Und dann müssen Sie nur noch das Bindeglied schreiben, die Teile, die alles zusammenhalten und ein einsatzfähiges Produktionsskript ergeben. Diesen Code können Sie sich auch ausleihen. Sie können ihn aus dem Skriptindex übernehmen, und Sie können ihn sich sicherlich auch aus dieser Präsentation ausleihen. |
| |
Alle Materialien sind in dieser Präsentation enthalten. Sie können sich außerdem im JSL-Kochbuch der JMP User Community bedienen, einer fantastischen Ressource, die viele gängige JSL-Aufgaben enthält und Ihnen den Code liefert, den Sie benötigen, um diese Aufgaben zu erfüllen. |
| |
Und ich möchte es noch einmal betonen: Machen Sie sich wegen der Syntax keine allzu großen Gedanken. Es ist viel einfacher, den Code zu nehmen und die benötigten Elemente zu ersetzen. Sie werden nichts kaputt machen, und die Feinheiten dieser Syntax werden Sie mit der Zeit lernen. |
| |
Vielen Dank für eure Aufmerksamkeit. |