Using scoping operators is an easy way to help JMP resolve ambiguous names (for example, when a name refers to both a variable and a column name).
In the following example, the prefix double-colon operator (::) identifies z as a global variable. The single-colon prefix operator (:) identifies x and y as column names.
::z = :x + :y;
Tip: The Names Default to Here(1) function also affects name resolution. See Names Default To Here and Global Variables in Programming Methods for details.
Two JSL functions are interchangeable with scoping operators. Scoping Operators describes the functions and syntax.
: |
As Column |
: name dt : name As Column(dt, name) |
Forces name to be evaluated as a data table column. The optional data table reference argument, dt, sets the current data table. See Scoped Column Names for examples.
|
:: |
As Global |
:: name As Global(name) |
Forces name to be evaluated as a global variable.
|
1.
|
The prefix colon (:) means that the name refers to a table column or table variable only, never a global variable. The prefix colon refers to the current data table context.
|
:age;
2.
|
The infix colon (:) operator extends this notion by using a data table reference to specify which data table has the column. This is particularly important when multiple data tables are referenced in a script.
|
In the following example, the dt variable sets the data table reference to Big Class.jmp. The infix colon separates the data table reference and age column.
dt = Data Table( "Big Class.jmp" );
dt:age // The colon is an infix operator.
As Column() achieves the same results:
dt = Data Table( "Big Class.jmp" );
As Column( dt, age );
Therefore, the following expressions are equivalent when only Big Class.jmp is open:
:age;
As Column( dt, age );
dt:age;
The Column function can also identify a column. For Big Class.jmp, the following expressions all refer to age, the second column in the table:
Column( "age" );
Column( 2 );
Column( dt, 2 );
Column( dt, "age" );
When you run a script that includes a column and variable with the same name, an Invalid Row Number error occurs. To prevent this problem, use unique column and variable names, or scope the names as follows:
::age = [];
age = :age << Get As Matrix;
::age = :age << Get As Matrix;
dt1 = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = Open( "$SAMPLE_DATA/Students.jmp" );
::age = dt1:age << Get As Matrix;
::height = dt2:height << Get As Matrix;
Note that JMP evaluates column formulas through each consecutive cell of the column, so scoping the column name is usually unnecessary. However, if a variable assigned in a formula has the same name as a column, you must scope the column name. For details, see Scoped Names in Programming Methods.
•
|
–
|
or the name is subscripted (for example, the subscript [1] in weight[1] selects the first value in the weight column).
|
If the data table has a table variable by that name, then the table variable takes precedence. In all other cases, it binds to a global, local, or argument. For more information about global and local variables, see Global and Local Variables.
By default, the current row is 0, an illegal row number. So the following expression assigns a missing value to the ratio global variable:
ratio = height / weight;
Specify the row number with the Row() function. In the following example, the row is set to 3. The height in that row is divided by the weight, and the result is assigned to the ratio global variable.
Row() = 3;
ratio = height / weight;
ratio = height[3] / weight[4];
Specifying the row number is unnecessary when the script iterates a row at a time down the whole column. The following example creates the ratio column. For each row, the height is divided by the weight.
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Column( "ratio" );
For Each Row( :ratio = height / weight );