Bei der Skripterstellung von JMP werden häufig Datenspaltenobjekte verwendet. Möglicherweise möchten wir Statistiken für eine Spalte mit numerischen Daten berechnen. Möglicherweise möchten wir ein Spaltenattribut oder eine Eigenschaft ändern. In jedem dieser Fälle benötigen wir einen Verweis auf die Spalte, damit wir sie als Argument angeben können. Es gibt verschiedene Möglichkeiten, eine Referenz abzurufen oder zu verwenden. Leider scheinen sie bis zu einem gewissen Punkt gleichwertig zu sein, bis wir überrascht sind. Eine wissenschaftliche Theorie ist überprüfbar. Eine Theorie gilt, bis ein Test sie ungültig macht. Lassen Sie uns einige Theorien über Spaltenreferenzen testen.
Ich benutze die Höhe Datenspalte in der Big Class-Datentabelle aus dem JMP-Beispieldatenordner C: \ Programme \ SAS \ JMPPRO \ 15 \ Samples \ Data in meinem Fall. Lass uns anfangen.
Names Default To Here( 1 );
// open a data table
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
In unserem ersten Test werden verschiedene Formen einer Spaltenreferenz für verwendet Höhe .
// use a reference to a data column
sum = Col Sum( :height );
Show( sum );
sum = Col Sum( Column( "height" ) );
Show( sum );
sum = Col Sum( Column( 4 ) );
Show( sum );
sum = Col Sum( :Name( "height" ) );
Show( sum );
sum = Col Sum( As Column( "height" ) );
Show( sum );
OK, was haben wir bekommen?

Jedes Mal das gleiche Ergebnis. Meine Theorie ist also, dass diese fünf verschiedenen Referenzen äquivalent sind. Mein erster Test bestätigt meine Theorie. Es ist aber nur der erste Test. Lassen Sie uns einen weiteren Test entwickeln. Lassen Sie uns zuerst die Spaltenreferenz abrufen, speichern und dann die gespeicherte Referenz verwenden, um dieselbe Statistik zu berechnen.
// get a reference to a data column and then use it
col = Column( "height" );
sum = Col Sum( col );
Show( sum );
col = Column( 4 );
sum = Col Sum( col );
Show( sum );
col = :Name( "height" );
sum = Col Sum( col );
Show( sum );
col = As Column( "height" );
sum = Col Sum( col );
Show( sum );
Beachten Sie, dass ich nicht die allererste Form einer Referenz aufgenommen habe. :Höhe weil der Wert zurückgegeben und im Ausdruck gespeichert wird col =: Höhe wird vermisst (".")! Dieses Ergebnis hilft meiner Theorie nicht! Was haben wir mit dem Rest des Tests bekommen?

Warte eine Minute! Ich habe keinen einzigen Fehler erhalten, aber nicht jedes Mal das gleiche Ergebnis. Die ersten beiden Ergebnisse sind korrekt, aber die letzten beiden sind falsch. (Beachten Sie, dass 40 Zeilen vorhanden sind Höhe und die letzte Höhe = 70. 40 * 70 = 2800 übrigens.) Lassen Sie uns noch einen Test meiner Theorie durchführen. Lassen Sie uns erneut eine Spaltenreferenz abrufen, diese speichern und dann zum Senden einer Nachricht verwenden.
// get a reference to a data column and then use it
col = Column( "height" );
type = col << Get Data Type;
Show( type );
col = Column( 4 );
type = col << Get Data Type;
Show( type );
col = :Name( "height" );
type = col << Get Data Type;
Show( type );
col = As Column( "height" );
type = col << Get Data Type;
Show( type );
Folgendes bekomme ich mit den ersten beiden Möglichkeiten.

Die ersten beiden Möglichkeiten scheinen wie erwartet zu funktionieren. Versuchen wir den dritten Weg.
col = :Name( "height" );
type = col << Get Data Type;
Show( type );
Dieser Weg hat nicht funktioniert.

Was ist mit dem letzten Weg?
col = As Column( "height" );
type = col << Get Data Type;
Show( type );
Ich erhalte den gleichen Fehler wie beim letzten Mal.

Es ist eindeutig an der Zeit, meine Theorie zu überarbeiten. (Und vielleicht, um sich den JMP-Entwicklern anzuvertrauen.) Meine Theorie ist jetzt das
- :Höhe , Spalte ("Höhe") , Spalte (4) , : Name ("Höhe") , und Als Spalte ("Höhe") Alle arbeiten oder fungieren als gültige Spaltenreferenz.
- Spalte ("Höhe") und Spalte (4) sind Funktionen, die eine Spaltenreferenz zurückgeben.
- :Höhe , : Name ("Höhe") , und Als Spalte ("Höhe") sind nicht Funktionen, die eine Spaltenreferenz zurückgeben.
- Wie Säule() ist ein Alias für den Doppelpunkt (" :: ") Scoping-Operator, wie in :Höhe , die beide den Wert der aktuellen Zeile zurückgeben, wenn sie in einer Zuweisung verwendet werden.
Was ist meine Empfehlung?
- Verwenden :Höhe , Spalte ("Höhe") , Spalte (4) , : Name ("Höhe") , oder Als Spalte ("Höhe") als Spaltenreferenz.
- Verwenden Spalte ("Höhe") oder Spalte (4) Funktionen zum Abrufen einer Spaltenreferenz.
- Verwende nicht :Höhe , : Name ("Höhe") , oder Als Spalte ("Höhe") um eine Spaltenreferenz zu erhalten.
Ich hoffe, dass diese Anpassung (Abscheulichkeit?) Der wissenschaftlichen Methode dazu beigetragen hat, zu klären, wie Spaltenreferenzen in JMP-Skripten verwendet werden können. Ich hoffe, dass Sie den Empfehlungen folgen und weitere Verwirrung und Frustration vermeiden.
@markbailey
wenn Sie Ihren Code ausführen
names default to here(1);
// get a reference to a data column and then use it
col = Column( "height" );
sum = Col Sum( col );
Show( sum );
col = Column( 4 );
sum = Col Sum( col );
Show( sum );
col = :Name( "height" );
sum = Col Sum( col );
Show( sum );
col = As Column( "height" );
sum = Col Sum( col );
Show( sum );
Ich bekomme Ihre Ergebnisse nicht ...... mit JMP 15.1. Was ich bekomme ist:
sum = 2502;
sum = 2502;
sum = .;
sum = .;
Was vermisse ich?
Ich glaube nicht, dass dir etwas fehlt!
Ich verwende auch JMP Pro 15.1. Ich habe es neu gestartet, bevor ich den Code getestet habe. Abgesehen davon bin ich mir nicht sicher, was zwischen den Erfahrungen anders sein könnte.
Vielen Dank für die Fortsetzung Ihres Tests meiner Theorie und Ihres Beitrags!