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()。