Sceneggiatura JMP spesso implica l'utilizzo di oggetti colonna di dati. Potremmo voler calcolare le statistiche per una colonna di dati numerici. Potremmo voler cambiare un attributo o una proprietà di una colonna. In ognuno di questi casi, abbiamo bisogno di un riferimento alla colonna in modo da poterlo fornire come argomento. Esistono diversi modi per ottenere o utilizzare un riferimento. Sfortunatamente, potrebbero sembrare equivalenti fino a un certo punto finché non siamo sorpresi. Una teoria scientifica è verificabile. Una teoria vale fino a quando un test non la invalida. Proviamo alcune teorie sui riferimenti alle colonne.
Sto usando il altezza colonna dati nella tabella dati Big Class dalla cartella dei dati di esempio JMP, che è C:\Programmi\SAS\JMPPRO\15\Samples\Data nel mio caso. Iniziamo.
Names Default To Here( 1 );
// open a data table
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Il nostro primo test utilizzerà diverse forme di riferimento di colonna per altezza .
// 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, cosa abbiamo ottenuto?

Stesso risultato ogni volta. Quindi la mia teoria è che questi cinque diversi riferimenti siano equivalenti. Il mio primo test conferma la mia teoria. Ma è solo la prima prova. Progettiamo un altro test. Prendiamo prima il riferimento alla colonna, lo memorizziamo, quindi utilizziamo il riferimento archiviato per calcolare la stessa statistica.
// 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 );
Si noti che non ho incluso la prima forma di riferimento, :altezza perché il valore restituito e archiviato nell'espressione col = :altezza manca (".")! Quel risultato non aiuta la mia teoria! Cosa abbiamo ottenuto con il resto del test?

Apetta un minuto! Non ho ricevuto un singolo errore, ma non ho ottenuto lo stesso risultato ogni volta. I primi due risultati sono corretti, ma gli ultimi due sono sbagliati. Eseguiamo un altro test della mia teoria. Otteniamo di nuovo un riferimento a una colonna, lo memorizziamo e quindi lo usiamo per inviare un messaggio.
// 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 );
Ecco cosa ottengo con i primi due modi.

I primi due modi sembrano funzionare come previsto. Proviamo la terza via.
col = :Name( "height" );
type = col << Get Data Type;
Show( type );
In questo modo non ha funzionato.

E l'ultimo modo?
col = As Column( "height" );
type = col << Get Data Type;
Show( type );
Ricevo lo stesso errore dell'ultima volta.

È chiaramente tempo di rivedere la mia teoria. (E forse per confidarmi con gli sviluppatori JMP.) La mia teoria ora è quella
- :altezza , Colonna( "altezza" ) , Colonna( 4 ) , :Nome( "altezza" ) , e As Colonna( "altezza" ) tutti funzionano o fungono da riferimento di colonna valido.
- Colonna( "altezza" ) e Colonna( 4 ) sono funzioni che restituiscono un riferimento a una colonna.
- :altezza , :Nome( "altezza" ) , e As Colonna( "altezza" ) sono non funzioni che restituiscono un riferimento a una colonna.
- Come Colonna() è un alias per i due punti (" : ") operatore di scoping, come si vede in :altezza , che restituiscono entrambi il valore della riga corrente se utilizzati in un'assegnazione.
Allora qual è la mia raccomandazione?
- Uso :altezza , Colonna( "altezza" ) , Colonna( 4 ) , :Nome( "altezza" ) , o As Colonna( "altezza" ) come riferimento di colonna.
- Uso Colonna( "altezza" ) o Colonna( 4 ) funzioni per ottenere un riferimento di colonna.
- Non usare :altezza , :Nome( "altezza" ) , o As Colonna( "altezza" ) per ottenere un riferimento di colonna.
Spero che questo adattamento (abominio?) del metodo scientifico abbia contribuito a chiarire come utilizzare i riferimenti alle colonne nello scripting JMP. Spero che tu segua i consigli ed eviti ulteriore confusione e frustrazione.
secondo me non ti manca nulla!
Sono stato in grado di testare di nuovo il codice e ho scoperto che si era verificato un errore di runtime nel mio primo tentativo. Ottengo il tuo stesso risultato. Ho modificato il mio articolo per riflettere il risultato corretto. Non cambio la storia.
@Mark_Bailey
Ho eseguito il tuo codice e ho ricevuto risultati diversi.Quando corro:
// 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 );
Ottengo:
sum = 2502;
sum = 2502;
sum = .;
sum = .;