回复:Column() vs As Column() vs datable:column vs dt:As name("column")关于 column() 和 as column() 之间区别的精彩视频教程:
最常见的 JSL 错误及其避免方法 (2020-US-30MP-571)
(从 5 分 18 秒开始)
举个例子
dt << Select Where( Column( colName )[Row()] == 14 );
dt << Select Where( As Column( colName ) == 14 );
有关
如何使用所有这些方法使 JSL 脚本能够适应列名的变化?
在列名更改后,捕获缺少列事件的错误处理功能怎么样 - 并带有自动修复代码的选项。
想法:
如果缺少某列,JMP 不会显示错误消息,而是会打开一个带有列列表的窗口来选择正确的列。
然后代码就可以继续执行 - 并且源代码可以自动修复。
编辑:直接链接到视频
https://community.jmp.com/t5/Abstracts/Most-Common-JSL-Mistakes-and-How-to-Avoid-Them-2020-US-30MP-571/ev-p/758506/redirect_from_archived_page/true#U281519
[顶部的链接并非在每个浏览器中都显示]
回复:Column() vs As Column() vs datatable:column vs dt:As name("column")最好的参考(除了我自己的经验和大量的试验和错误之外)来自脚本索引:


帮助页面是其他地方列(- ,“名称”,“格式化”)和
作为列(名称) . 这也有一些信息脚本指南 > JSL 构建块 > 名称解析规则 > 有关名称解析的常见问题解答和脚本指南 > 数据表 > 列 > 向数据列对象发送消息还迭代表中的行,所以基本上是文档(尤其是脚本指南)。
回复:Column() vs As Column() vs datatable:column vs dt:As name("column")您能否在您的回答中包含一个解释这一点的参考?
“作为 Column() “访问”列 (这意味着什么取决于情况...... )。”
回复:Column() vs As Column() vs datatable:column vs dt:As name("column")我通常不喜欢 +1 帖子,但是@jthi这与我为生产脚本所做的方法完全相同。我通常这样想
Names default to here( 1 );
dt = open("$SAMPLE_DATA\Big Class.jmp");
col_name = "age";
show(ismissing(AsColumn(dt, col_name)) & ismissing(dt:age)); // these are both the same as far as I know
cols = dt << get column references; // these are the actual references
show(cols[2] == Column(dt, col_name)); // these are references
回复:Column() vs As Column() vs datatable:column vs dt:As name("column")这是一个有点长的帖子,到处跳来跳去,抱歉..
因为 Column()、Column()、:colname, ... 在 JSL 中并不简单,使用哪个取决于具体情况。 我的首选方法是总是使用(除非我不能或者如果我想在脚本中看起来更清晰一些) Column(datatable_reference, "string of the name of the column"). :colname 确实有它的好处,有时可以用于脚本编写者的好处(这里提到了一些脚本指南 > JSL 构建块 > 名称解析规则 > 名称解析规则在例外部分)。
我还喜欢使用列名字符串而不是 :colname 语法来避免可能到处发生的一些问题。 例如 << Get Column Names("String") 而不是 << Get Column Names() 然后如果需要我用 Column(string) 获取引用。
列(- ,“名称”,“格式化”)和
作为列(名称)不一样。 Column() 返回对列的引用,并且 As Column “访问”列(这意味着什么取决于情况......)。 当您第一次运行此脚本时,dt:timestamp 将返回缺失值,因为 Row() 尚未针对 JMP 的索引正确定义(它被初始化为 0)。
查看更多...
@ih关于如何管理列中的名称更改有一些很好的建议。 此外,当将列插入到图形生成器中时,您可以使用使用 Eval Insert、Eval Expr、Parse 和 Substitute 将一个表达式插入另一个表达式有时是 Eval()。 << Get Name 有时也很有用,或者使用 Filter Col Selector / Col List Box 构建用户界面(例如@保丁建议)。
回复:Column() vs As Column() vs datatable:column vs dt:As name("column")怎么会你知道脚本应该引用哪一列?如果您确实需要监视列名更改,您可以通过订阅表中的更改并将这些列名记录在某处来实现,但我认为这会非常复杂。您可以改为定义列属性并搜索它吗?
从脚本指南订阅示例:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
f = Function( {dtab, col, oldname},
Print( dtab << getname() );
Print( "new column name", (col << getname()) );
Print( "old name", oldname );
);
sub = dt << Subscribe( "", OnRenameColumn( f ) );
Column( dt, 1 ) << set name( "test" );
Wait( 1 );
dt << unsubscribe( sub, on rename column );
使用列属性
Names Default To Here( 1 );
dt = Open( "$Sample_data/big class.jmp" );
dt:height << Set Property( "My Script Identifier", X );
XVar = Filter Each({c}, dt << Get Column References,
ident = char(c << Get Property( "My Script Identifier" ));
if( is empty(ident), 0, ident == "X", 1, 0)
)[1];回复:Column() vs As Column() vs datatable:column vs dt:As name("column")通过数字 column(dt, 1) 索引列或提示用户选择列或输入列名。 查看帮助文件中的 New Window()。
Column() vs As Column() vs datable:column vs dt:As name("column")JSL 有多种引用列的方法。 我们先打开一个数据表。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Bands data.jmp" );
现在我们创建一个具有类似内容的表脚本。
dt = current data table();
print(dt:timestamp == Column(dt, "timestamp"));
// 0
print(Column(dt, "timestamp")==As Column(dt, "timestamp"));
//0
在自动化脚本(例如图表)中,当用户更改列名称时,似乎会使脚本适应新的列名称。 这在自定义 JSL 中失败了,出现了类似 Index() 的内容。
如何使用所有这些方法使 JSL 脚本对列名更改具有鲁棒性?
问候,
自动化和脚本编写大规模定制回复:Column() vs As Column() vs datable:column vs dt:As name("column")这是愿望:)
捕获“缺少列”错误并提供选择菜单
JSL Editor 现在应该很容易实现 - 因为 Jmp 17 的新工作流程构建器刚刚引入了类似的功能:
https://community.jmp.com/t5/JMP-Wish-List/catch-quot-missing-column-quot-error-and-provide-a-selection/idc-p/561663/highlight/true#M2949
回复:Column() vs As Column() vs datable:column vs dt:As name("column")@brady_brady在Better JSL Smoother Migration: How To Fix Your Own Code @10min 中详细讨论了这个主题
编辑:
不幸的是,该视频已被存档。
https://community.jmp.com/t5/contentarchivals/contentarchivedpage/message-uid/537424#U537424
回复:Column() vs As Column() vs datable:column vs dt:As name("column")令人惊奇的是仪表板重命名列后仍然有效
- 如果它存储为表脚本
编辑:
啊,不……如果仪表板/应用程序不存储为表脚本,它甚至可以工作。
有趣的。
编辑2-局限性:
应用程序的 JSL“脚本”不会自动更新,只会更新应用程序后台的代码。

回复:Column() vs As Column() vs datable:column vs dt:As name("column")你的意思是这样的吗?
运行代码后,TABLE SCRIPT 中的前两个条目自动更改为新名称 *)
任何图形等都有相同的行为:所有内容都会自动调整为新的列名称。
非常酷!
但对于 As column() 和 Column() 来说它不起作用。
对于未存储为表脚本的脚本中的任何列名也没有这样做......