0

我运行 JMP 15.2.0 并且我的 jsl 脚本包含这部分代码,它有一个小错误:

for each row(
    if (:ColumnA == 99, ColumnA = .)
);

第二个ColumnA应该有一个前导:,以便用 null 替换 99。但是由于某种原因,尽管存在错误,但当通过 JMP 作为脚本运行时,它仍然有效,但在作为“加载项”安装时却无效。

当作为脚本运行时,为什么完全相同的脚本会起作用(即,99 按预期无效),而不是作为“加载项”(99 仍然存在并且日志中没有错误出现)?

无论是通过 JMP 作为脚本还是作为“加载项”运行,jsl 不应该被解释为相同的吗?我的 JMP 实例能否以某种方式设置为针对不同模式使用不同的引擎?有没有其他人观察到这种令人困惑的 JMP 奇怪现象?

4

2 回答 2

1

发生这种情况的原因是 JMP 处理范围的方式。当您给出一个无作用域的变量(不是 ns:var、:var、::var 的形式)时,JMP 有一个序列来尝试为感兴趣的变量找到合适的作用域。它是这样的

  1. 检查本地命名空间——如果找到,完成
  2. 检查当前数据表列,如果找到,完成
  3. 检查这里命名空间——如果找到,完成
  4. 检查全局命名空间——如果找到,完成

由于您没有在脚本中的任何位置定义“A 列”,因此“A 列”适用的唯一有效名称是列名。

在“For Each Row”语句中,顺序是首先检查列名(优先级高于任何其他范围)。

更新: 请注意,上面的列表适用于没有任何“无范围变量处理”的显式无范围变量——也就是说,没有“名称默认到此处(1)”行。请注意,如果您有该行启动脚本,那么它不会影响数据表,因为无范围的“ColumnA”变量只会放置在 Here 命名空间中。JMP 不会进行范围遍历以查看它是否可以在上面列出的各种命名空间中找到“ColumnA”变量。

我已经包含了将脚本附加到插件的最常见方式的图片——这就是我假设你正在做的事情。请注意,默认情况下,选中“使用“Here”命名空间获取不合格的 JSL 变量名”这一行——不合格的意思是没有冒号(无范围)。此复选框强制 JMP 在查看无范围变量时仅查看 Here:ColumnA。您需要在没有任何自动范围控制的情况下运行脚本才能像作为独立运行时那样工作。

默认情况下,添加脚本将无作用域的变量链接到“Here”命名空间,从而使无作用域的列名不起作用

于 2022-03-01T01:09:57.577 回答
0
Current data table(dt);
  
for each row(dt,
        if (: ColumnA == 99, :ColumnA = .););
于 2021-08-19T04:53:08.603 回答