表格列表:如何交互更新而不丢失选择我已经看到有关此主题的讨论,但我找不到解决方案。
问题如下:
我正在处理列表框中显示的表格列表。 我使用 N Table() 方式获取所有表的名称列表。
我想要的是,如果我单击以选择该列表中的任何行 - 列表本身会更新并检查是否有新打开的表或某些表已关闭。
这样做的好处是每次单击选择时都使用 Set Items(openDTs)。 它可以很好地更新表格列表 - 问题是它放弃了选择。
如果我在列表框中使用 Append(openDTs) - 它会添加任何打开的新表,但如果我关闭表,它不会删除关闭的表。
更新表列表的最优雅和正确的方法是什么,在任何单击列表时反映打开和关闭的表,以便保留选择?
回复:表格列表:如何以交互方式更新而不丢失选择米盖洛,
凯文·安德森 (Kevin Anderson) 在此链接的讨论中发布了我们的书 JSL Companion 的第二版中的脚本
比较列表但有部分字符串
因此,我的建议是修改您的第一个函数,该函数返回列表框中所选项目的列表。 然后将 Lfunc() 函数与 contains 一起使用,或使用一个交集函数来查找所选列表与 ctbls(当前表的列表)的交集。 结果列表将是您需要选择的列表。 该链接描述了一种使用关联数组查找交集的简单技术,或查看第 5 章中的附加脚本:函数uniq_intersect(ctbls,卖家) .
我希望这很清楚。 我昨天没有添加更多,因为您的其他功能非常接近。
回复:表格列表:如何以交互方式更新而不丢失选择谢谢,格鲁吉亚!
这绝对是拥有最新表格列表的更优雅的方式。 唯一的小问题是 - 用选定的项目更新列表框而不丢失选择的最佳方法是什么?
回复:表格列表:如何以交互方式更新而不丢失选择米盖洛,
如果您使用的是 JMP 14,则有一个新命令 Get Data Table List(),它返回打开的数据表的列表。 如果您不使用 JMP 14,则需要 N Table() 命令。
JMP 12、13,14 还提供订阅数据表列表 (, OnOpen() | OnClose() | OnRename() )。
下面是一个探索表订阅的脚本。 请注意,您可以在每次更改时更新列表,而不是显示 ctbls。
最后说明, NTable() 将“计算”不可见的数据表,但不计算私有数据表。
Names Default To Here( 1 );
//---Use one of these functions
//---- JMP 14 function
//ctbls = Get Window List( Type("DataTables")) << Get Window Title();
// --- User function to returns a list of table names
curtbl_fn = Function({}, {nt, tlist={}, i},
nt= NTable();
If(nt >0,
For(i=1, i<=nt, i++,
Insert into(tlist, Data Table(i) << get name)
);
); // end if
tlist
); //end Function
//------ functions to handle when a new table is created, whe a table is renamed and when a table is closed.
fnew = Function( {dtab},
Insert Into(ctbls, dtab << Get Name );
show(ctbls, NTable())
);
fnnme = Function( {dtab, b},{i},
show(dtab, b);
i = contains(ctbls, b );
If (i>0, ctbls[i] = dtab << get name);
show(ctbls, NTable())
);
fclose = Function( {dtab}, {i},
i = contains(ctbls, dtab<<GET name="">0, remove from(ctbls, i));
show(ctbls, NTable());
);
Open("$Sample_Data/Variability Data/2 Factors Crossed.jmp");
Open("$Sample_Data/Baseball.jmp");
Open("$Sample_Data/Basketball.jmp");
Open("$Sample_Data/Football.jmp");
Open("$Sample_Data/Fishing.jmp");
Open("$Sample_Data/Pogo Jumps.jmp");
//_____________________________________________________________________
//--- Run to here ------------------------
//use the JMP 14 command or the functions
ctbls =curtbl_fn();
show(ctbls, NTable());
//--- Run to here and check the log------------------------
aSub = Subscribe to Data Table List( , OnOpen( fnew ) );
Subscribe to Data Table List( aSub, OnRename( fnnme ) );
Subscribe to Data Table List( aSub, OnClose( fclose ) );
dt = Open( "$SAMPLE_DATA/Iris.jmp" );
Wait( 2 );
dt << setname( "yyy" );
// two printouts: one for OnOpen() and one for OnRename()
//--- Run to here and check the log------------------------
Close(Data Table("Fishing"), NoSave);
//--- Run to here and check the log------------------------
//Check Table manipulations
Data Table("yyy") << Subset (All Rows, All Columns, Output Table Name ("Iris redux") );
//--- Run to here and check the log------------------------
Unsubscribe to Data Table List(asub, All);
print("should not do anything");
Close(Data Table("Baseball"), NoSave);</GET>
回复:表格列表:如何以交互方式更新而不丢失选择现在我以这种方式解决了它:
我记住了所选表的名称,然后我使用 Set Items 完全重写,然后遍历整个列表并将记住的名称与新列表进行比较(顺序,因此索引现在可能不同!)。 一旦我遇到相同的名称,我就会记住该索引并使用该索引设置seceted。
这是代码:
listofTablesSelect=Function({this},{selectedIndex},
// This function is called when the List Box selection changes
selectedIndex = this << Get Selected;
selectedTableName = selectedIndex[1];
refreshListofTables();
for (i=1, i<=N Items(listofTablesList = this<<GET items=""></GET>refreshListofTables 使用 Set Items 的地方:
refreshListofTables = Function({},
Show("Trying to refresh list of tables");
openDTs = List();
For( i = 1, i <= N Table(), i++,
Insert Into( openDTs, Data Table( i )<<GET name=""></GET>我唯一不喜欢的是:日志窗口显示“JSL 递归被阻止”——recursion 到底在哪里? 是
this << Set Selected(recallIndex);
有效地呼唤整体
refreshListofTables
再次,因此进入复活?
有什么办法吗?
塔肯斯,
米