編寫JMP腳本通常涉及使用數據列對象。我們可能要計算一列數字數據的統計信息。我們可能想要更改列屬性或屬性。在任何一種情況下,我們都需要對該列的引用,以便可以將其作為參數提供。有幾種獲取或使用參考的方法。不幸的是,直到我們感到驚訝之前,它們似乎在某種程度上都是等效的。科學理論是可以檢驗的。一個理論一直保持到測試使之失效為止。讓我們測試一些有關列引用的理論。
我正在使用高度 JMP示例數據文件夾中Big Class數據表中的data列,即 C:\ Program Files \ SAS \ JMPPRO \ 15 \ Samples \ Data 就我而言。讓我們開始吧。
Names Default To Here( 1 );
// open a data table
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
我們的第一個測試將使用幾種不同形式的列引用高度 。
// 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 );
好,我們得到了什麼?

每次都有相同的結果。所以我的理論是這五個不同的參考是等效的。我的第一個測試證實了我的理論。但這只是第一次測試。讓我們設計另一個測試。首先,獲取列引用,將其存儲,然後使用存儲的引用來計算相同的統計信息。
// 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 );
請注意,我沒有包括參考的第一種形式, :高度因為該值返回並存儲在表達式中 col =:高度不見了 (”。”)!這個結果無助於我的理論!其餘的測試我們得到了什麼?

等一下!我沒有得到一個錯誤,但是每次都沒有得到相同的結果。前兩個結果正確,但後兩個錯誤。(請注意,其中有40行高度最後的高度= 70 順便說一下,40 * 70 =2800。)讓我們再對我的理論進行一次檢驗。讓我們再次獲取列引用,將其存儲,然後使用它來發送消息。
// 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 );
這是前兩種方式的結果。

前兩種方式似乎可以正常工作。讓我們嘗試第三種方式。
col = :Name( "height" );
type = col << Get Data Type;
Show( type );
這種方式行不通。

那最後的方法呢?
col = As Column( "height" );
type = col << Get Data Type;
Show( type );
我收到與上次相同的錯誤。

顯然是時候修改我的理論了。(也許可以信任JMP開發人員。)我的理論是
- :高度 ,列(“高度”) ,專欄(4) , :名稱(“ height”) 和作為列(“高度”) 所有工作或充當有效的列引用。
- 列(“高度”) 和專欄(4) 是返回列引用的函數。
- :高度 , :名稱(“ height”) 和作為列(“高度”) 是不返回列引用的函數。
- 如柱() 是冒號的別名(“ : “)作用域運算符,如 :高度 ,如果在分配中使用,它們都將返回當前行的值。
那我的建議是什麼?
- 採用 :高度 ,列(“高度”) ,專欄(4) , :名稱(“ height”) ,要么作為列(“高度”) 作為列參考。
- 採用列(“高度”) 要么專欄(4) 函數以獲取列引用。
- 不使用 :高度 , :名稱(“ height”) ,要么作為列(“高度”) 獲取列引用。
我希望科學方法的這種改編(廢除?)有助於闡明如何在JMP腳本中使用列引用。我希望您遵循建議,避免進一步的困惑和沮喪。
@markbailey
在運行代碼時
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 );
我沒有得到您的結果……正在運行JMP 15.1。 我得到的是:
sum = 2502;
sum = 2502;
sum = .;
sum = .;
我想念什麼?
我認為您沒有丟失任何東西!
我也在使用JMP Pro 15.1。在測試代碼之前,我重新啟動了它。除此之外,我不確定體驗之間可能有什麼不同。
感謝您繼續對我的理論進行的檢驗和您的貢獻!