JSL 在版本 19 中運行失敗,但在版本 17 中運作正常。我剛從 JMP 17 升級到 JMP 19。我有一個很長很複雜的程序,在 JMP 17 中運作良好,但在 JMP 19 中失敗了。可能還有其他問題,但我遇到的第一個問題與選擇要修改的行有關,目的是修復我匯入的資料中的已知錯誤。調試時,我發現“獲取行條件”命令返回了一個空矩陣。我已經確認目標行存在於資料表中,並且可以透過在選單視窗中輸入條件來強製程式選擇它。
row_to_update = newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0);
後續命令未能對該行進行所需的更正,因為 row_to_update 傳回的是:[](0, 1)
newContrib 之前被定義為一個資料表。當我將滑鼠懸停在變數名稱上時,彈出的視窗顯示了正確的表格。
根據文檔,我嘗試將該行程式碼修改為使用 Where 語句,但仍然失敗。
row_to_update = newContrib[Where(:"request_id" == 263496 & :"line_no" == 0)];
我在發行說明裡沒找到相關資訊。根據幫助手冊,我的文法似乎是正確的。
請問有人能解釋一下是什麼原因導致這個功能失效了嗎?以及如何修復?
非常感謝!
南希
自動化和腳本編寫回覆:JSL 在版本 19 中失敗,但在版本 17 中可以正常運作<< 在 JMP 19 中,「取得行」功能仍然有效。你的第二個指令(使用 Where())需要稍作修改。
Names Default To Here( 1 );
dt= Open( "$SAMPLE_DATA/Big Class.jmp" );
row_to_update = dt<< Get Rows Where( :"name" == "JANE" & :"age" == 12 ); //[3]
row_to_update2 = Where( dt, :name == "JANE" & :age == 12 ); //[3]
row_to_update = Where( newContrib, :request_id == 263496 & :line_no == 0 );
至於問題出在哪裡?請檢查資料類型是否正確。 JMP 19 是否將這些列作為字元型資料提取,而 JMP 17 則將其作為數值型資料提取?很可能是這類簡單的問題,因為 `<< Get Rows Where` 的語法並沒有改變。
回覆:JSL 在版本 19 中失敗,但在版本 17 中可以正常運作嗨,南希,
[](0,1) 表示 row_to_update 是一個空列表,因此在資料表中沒有任何符合的行。由於 Get Rows Where() 傳回的是一個列表,因此您或許可以採用以下腳本中的不同方法:
names default to here (1);
newContrib = New Table( "newContrib",
Add Rows( 3 ),
New Column( "request_id",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [263496, 263496, 263496] )
),
New Column( "line_no",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [0, 0, 1] )
)
);
row_to_update = newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0);
//row_to_update is [1,2]
row_to_update = newContrib << Get Rows Where(:"request_id" == 263497 & :"line_no" == 0);
//row_to_update is empty: [](0, 1)
row_to_update = (newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0))[1];
//row_to_update is 1
//a different approach:
rows_to_update = newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0);
if (n items(rows_to_update) > 0, row_to_update = rows_to_update[1]);
回覆:JSL 在版本 19 中失敗,但在版本 17 中可以正常運作感謝您解釋 Where 子句的正確語法,確認 Get Rows Where 的語法沒有改變,最重要的是,感謝您建議我檢查資料類型!這確實是問題所在(整數被當作字元導入)。實際上,我十幾個工作表上的所有資料現在都被導入為字符,而之前它們會被自動識別為各種類型。這是一個如此基礎的導入行為變化,我竟然從未想到要檢查,所以我非常感謝您提醒我注意基本設定!此外,添加程式碼行來更改列的資料類型或重新檢查 open 命令的設置,比修改數百行使用「Get Rows Where」的程式碼語法要容易得多!
非常感謝!
南希
回覆:JSL 在版本 19 中失敗,但在版本 17 中可以正常運作很高興它對你有用。我建議你更新腳本,使用 Where() 函數,效能提升非常顯著。舉個例子,我用一個包含一百萬行的表格運行了這段程式碼。 Where() 函數比 < 函數快了一個數量級。
Names Default to Here( 1 );
dt = Current Data Table();
now = HP Time();
row_to_update = dt << Get Rows Where( :request_id == 220681 & :line_no == 70 );
then = HP Time();
elapsed = then - now;
Show( elapsed ); //119053
Wait( 2 );
now = HP Time();
row_to_update = Where( dt, :request_id == 220681 & :line_no == 70 );
then = HP Time();
elapsed = then - now;
Show( elapsed ); //11777