jmp 脚本逻辑作为 jsl 但不是作为加载项
jmp script logic works as jsl but not as add-in
我 运行 JMP 15.2.0 和我的 jsl 脚本包括这部分代码,它有一个小错误:
for each row(
if (:ColumnA == 99, ColumnA = .)
);
第 2 个 ColumnA 应该有一个前导 :
,以便用 null 替换 99。但出于某种原因,尽管存在错误,但当通过 JMP 作为脚本 运行 时,但作为“加载项”安装时却无法正常工作。
当 运行 作为脚本而不是“加载项”(99 仍然存在并且日志中没有错误出现)时,为什么完全相同的脚本可以工作(即 99 按预期被取消) )?
无论 运行 通过 JMP 将 jsl 作为脚本还是作为“加载项”进行解释,难道不应该是一样的吗?我的 JMP 实例是否可以以某种方式设置为针对不同的模式使用不同的引擎?还有其他人观察到这种令人困惑的 JMP 奇怪现象吗?
Current data table(dt);
for each row(dt,
if (: ColumnA == 99, :ColumnA = .););
发生这种情况的原因是 JMP 处理范围的方式。当您给出一个未限定范围的变量(不是 ns:var、:var、::var 的形式)时,JMP 有一个序列来尝试为感兴趣的变量找到合适的范围。它是这样的
- 检查本地名称空间 -- 如果找到,则完成
- 检查当前数据 Table 列,如果找到,则完成
- 在此处检查命名空间 -- 如果找到,完成
- 检查全局命名空间 -- 如果找到,则完成
由于您没有在脚本中的任何地方定义“Column A”,因此“Column A”适用的唯一有效名称是列名。
在“For Each Row”语句中,顺序是首先检查列名(优先级高于任何其他范围)。
更新:
请注意,上面的列表是针对没有任何 'unscoped variable handling' 的显式未限定范围的变量——也就是说,没有“Names Default to Here(1)”行。请注意,如果您有该行启动脚本,那么它不会影响数据 table,因为未限定范围的“ColumnA”变量只会被放置在 Here 命名空间中。 JMP 不会 scope-walking 来查看它是否可以在上面列出的各种命名空间中找到“ColumnA”变量。
我附上了将脚本附加到插件的最常见方式的图片 -- 这就是我假设您正在做的事情。请注意,默认情况下 'Use the "Here" namespace for unqualified JSL variable names' 行被选中——非限定意味着没有冒号(无作用域)。此 check-box 强制 JMP 在查看未限定范围的变量时仅查看 Here:ColumnA。您需要 运行 没有任何自动范围控制的脚本才能像 运行 作为独立时那样工作。
Addin scripts by default link unscoped variables to the "Here" namespace, making it so that unscoped column names don't work
我 运行 JMP 15.2.0 和我的 jsl 脚本包括这部分代码,它有一个小错误:
for each row(
if (:ColumnA == 99, ColumnA = .)
);
第 2 个 ColumnA 应该有一个前导 :
,以便用 null 替换 99。但出于某种原因,尽管存在错误,但当通过 JMP 作为脚本 运行 时,但作为“加载项”安装时却无法正常工作。
当 运行 作为脚本而不是“加载项”(99 仍然存在并且日志中没有错误出现)时,为什么完全相同的脚本可以工作(即 99 按预期被取消) )?
无论 运行 通过 JMP 将 jsl 作为脚本还是作为“加载项”进行解释,难道不应该是一样的吗?我的 JMP 实例是否可以以某种方式设置为针对不同的模式使用不同的引擎?还有其他人观察到这种令人困惑的 JMP 奇怪现象吗?
Current data table(dt);
for each row(dt,
if (: ColumnA == 99, :ColumnA = .););
发生这种情况的原因是 JMP 处理范围的方式。当您给出一个未限定范围的变量(不是 ns:var、:var、::var 的形式)时,JMP 有一个序列来尝试为感兴趣的变量找到合适的范围。它是这样的
- 检查本地名称空间 -- 如果找到,则完成
- 检查当前数据 Table 列,如果找到,则完成
- 在此处检查命名空间 -- 如果找到,完成
- 检查全局命名空间 -- 如果找到,则完成
由于您没有在脚本中的任何地方定义“Column A”,因此“Column A”适用的唯一有效名称是列名。
在“For Each Row”语句中,顺序是首先检查列名(优先级高于任何其他范围)。
更新: 请注意,上面的列表是针对没有任何 'unscoped variable handling' 的显式未限定范围的变量——也就是说,没有“Names Default to Here(1)”行。请注意,如果您有该行启动脚本,那么它不会影响数据 table,因为未限定范围的“ColumnA”变量只会被放置在 Here 命名空间中。 JMP 不会 scope-walking 来查看它是否可以在上面列出的各种命名空间中找到“ColumnA”变量。
我附上了将脚本附加到插件的最常见方式的图片 -- 这就是我假设您正在做的事情。请注意,默认情况下 'Use the "Here" namespace for unqualified JSL variable names' 行被选中——非限定意味着没有冒号(无作用域)。此 check-box 强制 JMP 在查看未限定范围的变量时仅查看 Here:ColumnA。您需要 运行 没有任何自动范围控制的脚本才能像 运行 作为独立时那样工作。
Addin scripts by default link unscoped variables to the "Here" namespace, making it so that unscoped column names don't work