Skripterstellung JMP beinhaltet häufig die Verwendung von Datenspaltenobjekten. 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 mehrere Möglichkeiten, eine Referenz zu erhalten 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 widerlegt. Lassen Sie uns einige Theorien über Spaltenreferenzen testen.
Ich benutze die Höhe data-Spalte in der Big Class-Datentabelle aus dem JMP-Beispieldatenordner, d. h 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" );
Unser erster Test wird mehrere verschiedene Formen einer Spaltenreferenz für verwenden 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 gleichwertig sind. Mein erster Test bestätigt meine Theorie. Aber es ist nur der erste Test. Lassen Sie uns einen anderen 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 die allererste Form einer Referenz nicht eingefügt habe, :Höhe da der zurückgegebene und im Ausdruck gespeicherte Wert col = :höhe wird vermisst (".")! Dieses Ergebnis hilft meiner Theorie nicht weiter! Was haben wir mit dem Rest des Tests bekommen?

Warten Sie eine Minute! Ich habe keinen einzigen Fehler erhalten, aber ich habe nicht jedes Mal das gleiche Ergebnis erhalten. Die ersten beiden Ergebnisse sind richtig, aber die letzten beiden sind falsch. Führen wir einen weiteren Test meiner Theorie durch. Lassen Sie uns erneut eine Spaltenreferenz abrufen, 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 );
Hier ist, was ich mit den ersten beiden Möglichkeiten bekomme.

Die ersten beiden Wege 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 bekomme den gleichen Fehler wie beim letzten Mal.

Es ist eindeutig an der Zeit, meine Theorie zu revidieren. (Und vielleicht, um mich den JMP-Entwicklern anzuvertrauen.) Das ist jetzt meine Theorie
- :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 Spalte() ist ein Alias für den Doppelpunkt (" : ") Scoping-Operator, wie in zu sehen :Höhe , die beide den Wert der aktuellen Zeile zurückgeben, wenn sie in einer Zuweisung verwendet werden.
Was ist also 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, um eine Spaltenreferenz zu erhalten.
- 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 die Empfehlungen befolgen und weitere Verwirrung und Frustration vermeiden.
Ich glaube nicht, dass dir etwas fehlt!
Ich konnte den Code erneut testen und stellte fest, dass bei meinem ersten Versuch ein Laufzeitfehler aufgetreten war. Ich komme auf das gleiche Ergebnis wie du. Ich habe meinen Artikel bearbeitet, um das richtige Ergebnis widerzuspiegeln. Ich ändere die Geschichte nicht.
@Mark_Bailey
Ich habe Ihren Code ausgeführt und unterschiedliche Ergebnisse erhalten.Wenn ich laufe:
// 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:
sum = 2502;
sum = 2502;
sum = .;
sum = .;