编写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。在测试代码之前,我重新启动了它。除此之外,我不确定体验之间可能有什么不同。
感谢您继续对我的理论进行的检验和您的贡献!