表达式中的引号<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项(表) ,一世++,关(表[一世] ,不保存)) ; .