表達式中的引號<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
假設我想連接大量格式相同的表。 我希望一次調用連接函數,而不是一次連接一個數據表的循環。 這是因為我想學習 JMP 中的表達式。
我想要這樣的東西
數據表(“dt1”)<<連接(數據表(“dt2”),數據表(“dt3”),…,數據表(“dt100”))
在此示例中,我正在創建相同樣本數據的副本,但想像它們可能來自不同的來源並包含不同的值。
關閉所有(數據表,節省) ;
dt1 =打開( "$SAMPLE_DATA/大類.jmp" ) ;
ñ = 100 ;
/*在這個循環中,我正在復制數據表並創建一個字符串,目的是在連接函數中使用它*/
/*我使用轉義字符是因為我有雙引號*/
dt_string = “” ;
為了(一世= 2 ,一世<= ñ ,一世++,
dt_tmp = ( dt1 <<子集(所有行,所有列,無形的)) ;
dt_name = “dt” ||字符(一世) ;
dt_tmp <<設置名稱( dt_name ) ;
如果( dt_string == “” ,
dt_string = "數據表(\!"" || dt_name || "\!")" ;,
dt_string = dt_string || ", 數據表(\!"" || dt_name || "\!")" ) ;
) ;
節目( dt_string ) ;
連接表達式=表達式( dt1 <<連接( dt_list )) ;
節目(連接表達式) ;
concat_expr2 =代替(名稱expr (連接表達式) ,表達式( dt_list ) , dt_string ) ;
節目( concat_expr2 ) ;
評估( concat_expr2 ) ;
我的問題是表達式中仍然有轉義字符,並且它的評估失敗。
請問你能提出一個代碼來構造正確的表達式嗎?
提前致謝。
傑夫
回复:表達式中的引號需要明確的是,我提供的所有代碼(包括“Show(tbls)”在內)只是一種快速製作表格列表的方法,您可以將其用於連接。
但是如果你想讓東西不可見,你可以這樣做:
// 打開一個表
dt1 =打開( "$SAMPLE_DATA/大類.jmp" ) ;
dt1腳本= dt1 <<獲取腳本;
打印( dt1腳本) ;
插入( dt1腳本,表達式(無形的)) ;
打印( dt1腳本) ;
巧合的是,這是一個如何操作表達式的簡單示例。
回复:表達式中的引號謝謝兩位的回答。 我不知道我們可以提供列表來連接函數。
MS的答案正是我想要的。 我非常接近。
下面,我排列了這兩個選項,以便比較字符串與列表的功效。
字符串選項需要 2.85 秒,列表選項需要 4.38 秒。
我們可以通過使數據表不可見來加快代碼速度。 使用子集功能,我可以輕鬆添加不可見選項。 但是使用getscript,我不知道該怎麼做。
dt1 =打開( "$SAMPLE_DATA/大類.jmp" ) ;
ñ = 100;
開始=惠普時間() ;
dt_string = “” ;
為了(一世= 2 ,一世<= ñ ,一世++,
dt_tmp = ( dt1 <<子集(所有行,所有列)) ;
dt_name = “dt” ||字符(一世) ;
dt_tmp <<設置名稱( dt_name ) ;
如果( dt_string == “” ,
dt_string = "數據表(\!"" || dt_name || "\!")" ;,
dt_string = dt_string || ", 數據表(\!"" || dt_name || "\!")" ) ;
) ;
節目( dt_string ) ;
連接表達式=表達式( dt1 <<連接( dt_list )) ;
節目(連接表達式) ;
concat_expr2 =代替(名稱expr (連接表達式) ,表達式( dt_list ) ,解析( “{” || dt_string || “}” )) ;
節目( concat_expr2 ) ;
評估( concat_expr2 ) ;
為了(一世= 2 ,一世<= ñ ,一世++,關(數據表( “dt” ||字符(一世)) ,不保存)) ;
結尾=惠普時間() ;
解決方案1 = (結尾-開始) / 1e6 ; /*有秒而不是微秒*/
開始=惠普時間() ;
dt1腳本= dt1 <<獲取腳本;
表= {} ;
為了(一世= 2 ,一世<= ñ ,一世++,
評估( dt1腳本) ;
插入(表,數據表( 《大課堂》 ||字符(一世))) ;
) ;
節目(表) ;
dt1 <<連接(表) ;
為了(一世= 1 ,一世<= N項(表) ,一世++,關(表[一世] ,不保存)) ;
結尾=惠普時間() ;
解決方案2 = (結尾-開始) / 1e6 ; /*有秒而不是微秒*/
回复:表達式中的引號(請避免發布代碼,例如關閉所有(數據表,節省) ;我很粗心,首先無法理解我所有打開的窗戶發生了什麼)
看起來你得到了表達式和字符串的混合。 在某個階段,必須將字符串解析為可執行代碼(在這種情況下最好是列表)。
如果您更改代碼,您的代碼應該可以正常工作concat_expr2分配到這個:
concat_expr2 =代替(名稱expr (連接表達式) ,表達式( dt_list ) ,解析( “{” || dt_string || “}” )) ;
但是我建議一種更簡單的方法:跳過字符串並直接構建一個列表。
dt1 =打開( "$SAMPLE_DATA/大類.jmp" ) ;
ñ = 10 ;
dt_list = {} ;
為了(一世= 2 ,一世<= ñ ,一世++,
dt_tmp = dt1 <<子集(所有行,所有列,無形的) ;
插入( dt_list , dt_tmp ) ;
) ;
dt1 <<連接( dt_list ) ;
回复:表達式中的引號讀了兩遍後,我認為您的“連接”問題只是一個示例,可讓您深入研究表達式的使用。
但是,如果不是,請注意 '<< Concatenate()' 將獲取表格列表,因此如果您只是想完成工作,則不必弄亂它們:
名稱DefaultToHere ( 1 ) ;
// 打開一個表
dt1 =打開( "$SAMPLE_DATA/大類.jmp" ) ;
dt1腳本= dt1 <<獲取腳本;
// 製作一些副本
n = 4 ;
表= {} ;
為了(一世= 1 ,一世<= n ,一世++,
評估( dt1腳本) ;
插入(表,數據表( 《大課堂》 ||字符(一世+ 1 ))) ;
) ;
節目(表) ;
// 將副本連接到第一個表 - 您可以使用表列表,tbls
dt1 <<連接(表,追加到第一表) ;
// 關閉除第一個表之外的所有表
為了(一世= 1 ,一世<= N項(表) ,一世++,關(表[一世] ,不保存)) ; .