如何自动将所有列添加到 .jsl 中的列切换器我还是 JSL 的初学者,我还在学习中——
我有许多文件需要使用图形生成器查看,每个文件都有不同的列数。 唯一不变的是,我知道我希望第 1 列作为叠加,第 2 列作为 X 轴,第 3 列作为 Y 轴,以及列切换器中的所有其余列。 我希望有一个脚本可以使用这些设置为所有当前打开的数据表打开所有图形生成器窗口,但我不知道该怎么做。 这是我得到的最接近的:
Graph Builder(
Size( 1900, 1200 ),
Variables(
X( :Column(2) ),
Y( :Column(3) ),
Overlay( :Column(1) )
),
Elements( Points( X, Y, Legend( 10 ) ), Line( X, Y, Legend( 11 ) ) ),
Column Switcher( :Column(3) ),
SendToReport(
Dispatch(
{},
"",
ScaleBox
)
)
);
我需要帮助的两件事:(1)弄清楚如何设置列切换器以自动加载数据表中的所有列而不询问我,(2)将此脚本包装在一个循环中,迭代所有打开的列数据表。
提前致谢!
大规模定制回复:如何自动将所有列添加到 .jsl 中的列切换器感谢这里提供帮助的人,我觉得我自己在这里没有添加太多。 这基本上就是我最终得到的结果:
目标是有一个脚本,可以一次遍历一个充满文本文件的文件夹,加载它,并打开一个预先设置了一些设置的图形生成器窗口,然后当图形生成器关闭时,它会自动打开下一个。
我使用的方法是使用全局变量来管理它:“regFlist”是要打开的文件列表,“stopReg”是一个标志,打开时会中断进程。
有两个脚本: (1) reg_Next.jsl -- 检查 regFlist,如果为空,则询问要使用的文件夹;否则,它会从 regFlist 列表中加载下一个文件(如果未设置 regStop), (2) reg_Stop.jsl — 简单地清空 regFlist 并设置 regStop 变量;用于提前停止进程。
我是 .jsl 的初学者,所以我非常愿意接受任何反馈/建设性批评。
reg_Next.jsl
//!<BR /><BR />// use global variables (since hey, what could go wrong? ;)</img> )
Names Default To Here( 0 );
// get path to self
selfPath = get default directory() || "/reg_Next.jsl";
// check to see if user has requested a stop
If( stopReg == 1 ,
stopReg = 0;
regFlist = {};
Stop();
);
// initialize list of files to review if there aren't any in the list
If( Is Empty( regFlist ) | N Items( regFlist ) < 1,
jmpDir = Pick Directory( "Select the jmp directory." );
regFlist = Files In Directory( jmpDir );
);
// open data table and remove it from the regFlist
dt = Open( jmpDir || "/" || regFlist[1] );
regFlist = Remove( regFlist, 1 );
// set up for column switcher
colList = dt << get column names( string );
col1 = colList[1];
col2 = colList[2];
col3 = colList[3];
Remove From( colList, 1, 2 );
// open graph builder
gb = dt << Graph Builder(
size( 800, 600 ),
Variables( X( As Column( col2 ) ), Y( As Column( col3 ) ), Overlay( As Column( col1 ) ) ),
Elements( Points( X, Y, Legend( 10 ) ), Line( X, Y, Legend( 11 ) ) )
);
cs = gb << Column Switcher( col3, colList );
// set up mechanism to re-run myself when graph builder is closed
If( N Items( regFlist ) == 0,
gb << on close( Close( dt, nosave ) ),
gb << on close(
Close( dt, nosave );
Open( selfPath, Run JSL( 1 ) );
)
);reg_Stop.jsl
//!
Names Default To Here( 0 );
regFlist = {};
stopReg = 1;回复:如何自动将所有列添加到 .jsl 中的列切换器@BHarris如果您可以将您的解决方案添加到此讨论中,那就太好了,这样整个讨论社区都可以使用它。
回复:如何自动将所有列添加到 .jsl 中的列切换器我想到了。 我真的希望 JMP 有时有一个终端......
如果其他人发现自己在这里寻找相同的解决方案,请回复,我将分享我最终得到的结果。
回复:如何自动将所有列添加到 .jsl 中的列切换器@tx尼尔森-- 我刚刚花了大约 3 个小时使用脚本索引和脚本指南来尝试完成这项工作,但无法弄清楚如何使“on close()”函数打开下一个文件。 这是我认为“应该”有效的方法,但事实并非如此。
(提醒,目标是一次逐步浏览这些文件,打开一个图形生成器窗口并让我评估该文件,然后当我关闭图形生成器窗口时,它应该关闭数据表并打开下一个文件并绘制它。)
该脚本名为“jmp_reg_4.jsl”,位于我的桌面上:
Names Default To Here( 0 ); // <-- trying to use globals so the file list will be maintained between invocations
/*
All of what you suggest is doable in JMP.
You can use "Files in Directory()" to get the file list, and then loop through them.
You can attach an "On Close()" function to the Graph Builder object, which will close the current data table, and then go get the next file from your list of files from the "Files in Directory()" list.
Examples and description are in the Scripting Index
Help==>Scripting Index
*/
If( Not( As Global( "flist" ) ),
jmpDir = Pick Directory( "Select the jmp directory." );
flist = Files In Directory( jmpDir );
);
dt = Open( jmpDir || "/" || flist[1] );
Remove( flist, 1 );
colList = dt << get column names( string );
col1 = colList[1];
col2 = colList[2];
col3 = colList[3];
Remove From( colList, 1, 2 );
gb = dt << Graph Builder(
size( 800, 600 ),
Variables( X( As Column( col2 ) ), Y( As Column( col3 ) ), Overlay( As Column( col1 ) ) ),
Elements( Points( X, Y, Legend( 10 ) ), Line( X, Y, Legend( 11 ) ) )
);
cs = gb << Column Switcher( col3, colList );
gb << on close(
Close( dt, nosave );
run script( "/Users/bh/Desktop/jmp_reg_4.jsl" );
);我以为我正在创建一个要检查的全局文件列表,然后在每次调用时,如果“flist”(文件列表)变量中仍然有元素,那么我们只需获取下一个并加载它并绘制它。 但它没有按我的预期工作:当我关闭图形生成器窗口时,它会正确关闭数据表,但不会执行其他任何操作。
回复:如何自动将所有列添加到 .jsl 中的列切换器我也找不到办法,但按几下 Tab 键会将焦点转移到列切换器中的列列表。

回复:如何自动将所有列添加到 .jsl 中的列切换器我不知道如何完成第二个请求。回复:如何自动将所有列添加到 .jsl 中的列切换器谢谢!
我的列表中的#2 怎么样? (我想我可以弄清楚#3...)回复:如何自动将所有列添加到 .jsl 中的列切换器您建议的所有内容都可以在 JMP 中实现。
您可以使用“Files in Directory()”来获取文件列表,然后循环遍历它们。
您可以将“On Close()”函数附加到图形生成器对象,这将关闭当前数据表,然后从“Files in Directory()”列表中的文件列表中获取下一个文件。
示例和描述位于脚本索引中
帮助==>脚本索引
回复:如何自动将所有列添加到 .jsl 中的列切换器感人的! 我一直尝试使用“Column Switcher(:Column(3),:Column(all))”及其变体
对脚本的这些改进是否可行? (1)给它一个装满txt文件的文件夹,并让它在图形生成器中一次打开它们,当我关闭图形生成器时,它会关闭相应的数据表文件并打开下一个,(2)自动将焦点移至列切换器,这样我就可以立即开始在变量中使用箭头,而无需单击列切换器框,(3) 当图形生成器窗口打开时,将其在屏幕上显示为全尺寸。
JMP 很快成为我最喜欢的软件。回复:如何自动将所有列添加到 .jsl 中的列切换器脚本编写非常简单,
Names Default To Here( 1 );
// Loop across all data tables
For( i = 1, i <= N Table(), i++,
dt = Data Table( i );
// Find all of the column names
colList = dt << get column names( string );
// Get the first 3 columns for special processing
col1 = colList[1];
col2 = colList[2];
col3 = colList[3];
// Remove first 2 from column switcher columns from the overall list
Remove From( colList, 1, 2 );
// Run the Graph Builder
dt << Graph Builder(
Size( 570, 621 ),
Variables(
X( As Column( col2 ) ),
Y( As Column( col3 ) ),
Overlay( As Column( col1 ) )
),
Elements( Points( X, Y, Legend( 10 ) ), Line( X, Y, Legend( 11 ) ) ),
Column Switcher( col3, colList )
);
);