Column() vs As Column() vs datatable: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 datatable:column vs dt:As name("column")实际上令人惊讶的是仪表板重命名列后仍然有效
- 如果它存储为表脚本;)
感谢您实施如此出色的自动更正算法。
回复:Column() vs As Column() vs datatable:column vs dt:As name("column")这是愿望:)
https://community.jmp.com/t5/JMP-Wish-List/catch-quot-missing-column-quot-error-and-provide-a-selection/idi-p/556596
JSL 编辑器现在应该很容易实现——因为 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 datatable: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 不会显示错误消息,而是会打开一个包含列列表的窗口以选择正确的列。
然后代码的执行可以继续运行——源代码可以自动修复。
回复: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)。
查看更多...
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
//Row() = 0;
Show(Row(), dt:name, Column(dt, "name"), As Column(dt, "name"));
Row() = 1;
Show(Row(), dt:name, Column(dt, "name"), As Column(dt, "name"), Column(dt, "name")[], Column(dt, "name")[Row()]);
Print(dt:name == Column(dt, "name"));
// 0
Print(Column(dt, "name") == As Column(dt, "name"));
//0
Print(dt:name == As Column(dt, "name"));
//1
stop();
//
Show(Column("name") << get values);
Show(As Column("name") << get values);
Show(:name << get values);
stop();
col1 = "name";
gb = dt << Graph Builder(
Size(529, 466),
Show Control Panel(0),
Variables(X(col1), Y(:height)),
Elements(Points(X, Y, Legend(6)))
);
gb = dt << Graph Builder(
Size(529, 466),
Show Control Panel(0),
Variables(X(Eval(col1)), Y(:height)),
Elements(Points(X, Y, Legend(6)))
);
gb = dt << Graph Builder(
Size(529, 466),
Show Control Panel(0),
Variables(X(As Column(col1)), Y(:height)),
Elements(Points(X, Y, Legend(6)))
);
gb = dt << Graph Builder(
Size(529, 466),
Show Control Panel(0),
Variables(X(Column(col1)), Y(:height)),
Elements(Points(X, Y, Legend(6)))
);
gb = dt << Graph Builder(
Size(529, 466),
Show Control Panel(0),
Variables(X(Column(dt, col1)), Y(:height)),
Elements(Points(X, Y, Legend(6)))
);
@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")你的意思是这样的?
运行代码后,TABLE SCRIPT 中的前两个条目自动更改为新名称。
它甚至适用于 :"name"n
任何图形等的行为相同:自动调整为新的列名。
但是对于 As column() 和 Column() 它不起作用。
原始脚本中的任何列名也没有这样做:)
前:

后:

dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt << New Script(
"script",
:name;
:"name"n;<BR /> As Column( "name" );
Column("name");
);
dt:name << Set Name( "name_2" );
dt:name[1]
回复: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()。