Depending on the complexity of your script, it might be obvious that ratio is a variable and height and weight are data table column names. But what if the meanings are ambiguous? A script might use ratio as a global variable and as column names.
The syntax Scale( "Log" ) is preferred for setting a string literal. To catch ambiguous instances, set the “Allow Unquoted Strings in JSL” General preference to “Yes (with a warning)” or “No”.
JMP interprets object names using name resolution. The following rules are applied sequentially to unscoped names:
1.
|
When the name is part of a script for an object, it is usually the name of an option or method in the object. For example, Show Points() is an option in the Bivariate object:
|
2.
|
If a name is not preceded by the : scoping operator, look it up in a namespace, such as Global or Here.
|
3.
|
If a name is followed by a pair of parentheses (), look up the name as a built-in function (not a user-defined function).
|
4.
|
If a name is preceded by the : scoping operator, look it up as a data table column or table variable.
|
5.
|
If a name is preceded by the :: scoping operator, look it up as a global variable.
|
7.
|
8.
|
If a name is used as the left side of an assignment (the L-value) and Names Default To Here(0) is at the top of the script, create and use a global variable.
|
The following sections describe how JMP resolves the names of data table columns. For more information about name resolution, see Advanced Scoping and Namespaces in Programming Methods.
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.
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(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.
|
||
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.
|
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.
As Column achieves the same results:
Therefore, the following expressions are equivalent when only Big Class.jmp is open:
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:
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:
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:
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;
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.
JMP evaluates formulas and calculates pre-evaluated statistics iteratively down a column. In these instances, identifying the row number is also unnecessary. (Pre-evaluated statistics are single numbers computed from the data table, as discussed in Pre-Evaluated Statistics in Data Tables.)
When you reference a column name using As Name(), and Names Default To Here(1) is set, JMP returns a variable reference. That reference is then processed using the standard reference rules.
•
|
•
|
Name resolution errors can also occur when a variable and unquoted keyword have the same name. For example, one argument for <<Preselect Role() is “Y”. Quote this argument if your script also uses Y as a variable.
If you are writing such scripts, consider using explicit scoping and namespaces. See Advanced Scoping and Namespaces in Programming Methods for more information.
When a column has been assigned to a global variable, assign a value to a cell in the column using a subscript. Suppose that the name of the column height has been assigned to the x variable:
Assign a value to the third row in the height column as follows:
Note: The current row in a JSL script is not determined by selecting rows or positioning your cursor in the row. The current row is defined to be zero (no row) by default. You can set a current row with Row() (for example, Row() = 3). Please note that such a setting only lasts for the duration of that script. Then, Row() reverts to its default value, zero. This behavior means that submitting a script all at once can produce different results than submitting a script a few lines at a time.
Another way to establish a current row for a script is to enclose it in For Each Row(). This method executes the script once for each row of the current data table. For an example, see If. See Data Tables section for more information about working with data tables.
|
Yes. Once you use a scoping operator with a name, that name continues to be resolved accordingly for all subsequent occurrences of the name. For example, a script might contain a column and a variable named age. When you declare the global variable age with the scoping operator :: at the beginning of the script, age is always interpreted as a global variable in the script. The values in the age column are not affected by the variable.