用於在當前選定列上打開數據過濾器的腳本,啟用查找和正則表達式完全披露:我不是編碼員,JSL 給我帶來了特別困難的時間,但是我覺得我正在編寫的這部分腳本應該比以前容易得多。 我經常使用數據過濾器,啟用了“查找”和“正則表達式”(見圖),但是沒有保存這些設置的選項,所以每次我打開過濾器時都必須重新啟用它們,這很麻煩。 我想要的是一個嵌入式表腳本:
1) 打開數據過濾器
2) 自動添加當前選定的列(即我將選擇一個列,然後啟動腳本)
3)啟用“查找”
4) 啟用“正則表達式”

不幸的是,保存腳本選項只保存了這個:
Current Data Table() << Data Filter(
Location( {630, 160} ),
Conditional,
Add Filter( columns( :name ), Display( :name, Size( 160, 225 ), List Display ) )
);Find 和 Regex 不與腳本一起保存。 . .
但是,這是迫使我尋求幫助的部分,我終其一生都無法弄清楚如何將當前選定的列的名稱傳遞給“columns()”和“Display()”函數。
我試過很多東西,例如這個:
Names Default to Here( 1 );
dt = Current Data Table( );
col_selected = dt << Get Selected Columns(string);
dt << Data Filter(
Location( {630, 160} ),
Conditional,
Add Filter( columns( col_selected ), Display( col_selected, Size( 160, 225 ), List Display ) )
);但我得到一個錯誤:
“在數據表中找不到指定的列。在訪問或評估“列”時,列(col_selected)/*###*/”
可能是因為 col_selected 是一個列表,但我不知道如何從單項列表中獲取名稱。 真的不應該這麼難。
回复:在當前選定列上打開數據過濾器的腳本,啟用查找和正則表達式謝謝@馬克貝利這也有效,儘管如果選擇了多個,它只過濾第一列。 但是,使用您的建議獲取列引用使我能夠創建一個完全符合我要求的 FOR 循環。
Names Default to Here( 1 );
dt = Current Data Table( );
list = dt << Get Selected Columns( );
obj = dt << Data Filter( );
For( i = 1, i <= N Items( list ), i++,
obj << Add Filter( columns( Column( list[i] ) )
)
);
回复:在當前選定列上打開數據過濾器的腳本,啟用查找和正則表達式這條路很曲折。 不過,這並不是唯一可行的方法。 表達式是強大的構造函數,但並不總是必需的。 請記住,Columns() 參數需要一個列引用。 這就是它的全部。 它可能是文字值(列名)、存儲在變量中的值或從函數返回的值。
Names Default to Here( 1 );
// open example data table
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
// select a column (mimic result by interactive user)
dt << Go To( :age );
// identify selection
col = dt << Get Selected Columns( String );
// obtain column reference
col = Column( col[1] );
// launch data filter on selected column
df = dt << Data Filter(
Add Filter( Columns( col ) )
);
回复:在當前選定列上打開數據過濾器的腳本,啟用查找和正則表達式@ionatx我和你在一起。我自己也為此苦苦掙扎,最終在論壇上找到了解決方案。我的粗略理解是你需要經歷所有這些冗長的過程才能將一個表達式插入另一個表達式。 使用您的原始代碼,col_selected 永遠不會評估。Data Filter() 只看到它無法識別為列標題的字符“col_selected”,因此返回錯誤“在數據表中找不到指定的列”。因此,您將它包含在 Expr() 中,這表示它是一個需要計算的表達式。然後將整個內容包含在 Eval Expr() 中,以強制計算包含在 Expr() 中的內容。然後將整個 Eval() 包裹起來表達這本質上執行產生所需輸出的表達式。這一切都讓人感覺非常複雜,但這就是它的工作原理。
你想了解更多嗎?https://community.jmp.com/t5/JSL-Cookbook/Insert-one-expression-into-another-using-Eval-Insert-Eval-Expr/ta-p/48998
回复:在當前選定列上打開數據過濾器的腳本,啟用查找和正則表達式@Chris_Rodrigues那行得通,我不明白為什麼它起作用了,但它起作用了。
@Jeff_Perkinson謝謝你的跟進,是的,我會的。
回复:在當前選定列上打開數據過濾器的腳本,啟用查找和正則表達式@Chris_Rodrigues有一個關於如何讓變量在 Data Filter() 消息中進行評估的句柄,我可以確認 JSL 不支持打開 Find 和 Regex 選項。
如果您覺得這很有價值,請務必將其輸入JMP 願望清單.
回复:在當前選定列上打開數據過濾器的腳本,啟用查找和正則表達式為了將像 col_selected 這樣的變量傳遞給數據過濾器函數,您必須使用 Eval(Eval Expr(Expr())) 構造。JSL 太奇怪了。但這是它的樣子:
Names Default to Here( 1 );
dt = Current Data Table( );
col_selected = dt << Get Selected Columns(string);
Eval(
Eval Expr(
dt << Data Filter(
Location( {630, 160} ),
Conditional,
Add Filter( columns( Expr(col_selected) ), Display( Expr(col_selected), Size( 160, 225 ), List Display ) )
);
)
);對於 Find 和 Regex 選項... 我什至懷疑這是否可能。如果您查看腳本指南中的 Data Filter() 文檔,則不會提及這些選項。我懷疑腳本界面是否具有這種粒度級別,並且這些複選框只能以交互方式顯示。不過我可能錯了。其他人可能會提出解決方案。