Scripting JMP spesso comporta l'utilizzo di oggetti colonna di dati. Potremmo voler calcolare le statistiche per una colonna di dati numerici. Potremmo voler modificare 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 fino a quando non siamo sorpresi. Una teoria scientifica è verificabile. Una teoria vale finché un test non la invalida. Proviamo alcune teorie sui riferimenti di colonna.
Sto usando il altezza data nella tabella dati Big Class dalla cartella dei dati di esempio di JMP, ovvero 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. Escogitiamo un altro test. Prendiamo prima il riferimento alla colonna, memorizziamolo, quindi usiamo il riferimento memorizzato 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 );
Nota che non ho incluso la primissima forma di riferimento, :altezza perché il valore restituito e memorizzato nell'espressione col = :altezza manca (".")! Questo 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 nuovamente un riferimento di colonna, memorizziamolo 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 );
Ottengo lo stesso errore dell'ultima volta.

È chiaramente giunto il momento di rivedere la mia teoria. (E forse per confidarsi con gli sviluppatori di 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 di colonna.
- :altezza , :Nome( "altezza" ) , E As Colonna( "altezza" ) Sono non funzioni che restituiscono un riferimento di colonna.
- COME Colonna() è un alias per i due punti (" : ") operatore di scoping, come visto in :altezza , che restituiscono entrambi il valore della riga corrente se utilizzati in un'assegnazione.
Quindi qual è la mia raccomandazione?
- Utilizzo :altezza , Colonna( "altezza" ) , Colonna( 4 ) , :Nome( "altezza" ) , O As Colonna( "altezza" ) come riferimento di colonna.
- Utilizzo 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 i riferimenti di colonna possono essere utilizzati negli script JMP. Spero che seguirai le raccomandazioni ed eviterai ulteriore confusione e frustrazione.
secondo me non ti manca niente!
Sono stato in grado di testare nuovamente il codice e ho scoperto che c'era 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 = .;