从分层数据创建动态 JSL 树框有人可以建议一种使用分层数据创建动态嵌套树框的方法吗? 今晚我尝试了几个小时,这让我很困惑:(
我下面有一些虚拟数据来描述三层深度的关系。 显然我不想对此进行硬编码,因为我不会预先知道需要进行多少层“嵌套”。 实际上,它将有 10 个或更多级别。
干杯,特洛伊
这就是我要开始的(附表)

这就是我想要生成的

自动化和脚本编写回复:从分层数据创建动态 JSL 树框似乎代码被截断了
回复:从分层数据创建动态 JSL 树框感谢您报告无法重新打开已关闭节点的问题, @Craige_Hales 。该错误已在 JMP 17 中得到解决。
回复:从分层数据创建动态 JSL 树框是的我同意。 非常优雅的解决方案。 我正走在追踪父母/孩子关系的道路上,事情开始变得混乱。
感谢大家的回复,许多优秀的代码片段。
- 特洛伊
回复:从分层数据创建动态 JSL 树框鱼骨图有一个右键菜单可以重新排列它们。 它们都使用相同的显示框树。 可以向树添加其他控件,类似于标签。 该平台隐藏在分析->质量和流程->图表下。
dt = Open("/Z:/DummyTable.csv");
diagram = dt << diagram(parent(MGR_ID),child(EMP_ID),label(FULL_NAME));
// fishbone is the default, change it like this:
(report(diagram)[hierbox(1)])<<CHANGETYPE></CHANGETYPE>
NestedNested嵌套
FishboneFishbone鱼骨
HierarchyHierarchy等级制度
编辑:图表平台可能无法在 JMP 15/16 中重新打开关闭的节点(通过弹出菜单)。 在 JMP 14 中可以。 我已经报告了这个问题。
回复:从分层数据创建动态 JSL 树框@ErraticAttack
很好的解决方案!
回复:从分层数据创建动态 JSL 树框据我了解,我认为这符合您的需求:
Names Default to Here( 1 );
dt = Data Table( "DummyTable" );
relations = [=>];
For Each Row( dt,
relations[:FULL_NAME] = Tree Node( :FULL_NAME );
relations[:FULL_NAME] <<SET data="https://community.jmp.com/"></SET>
回复:从分层数据创建动态 JSL 树框您可能会从这里得到一些想法目录树:探索文件夹使用的空间或者可能来自我一直在研究的文件索引器jthi-jmp-tools/文件索引器 (github.com) (参见 bin/bin/DirectoryTreeHandler.jsl,它还没有像我希望的那样通用,但希望它能到达那里),我的代码目前一团糟,因为我没有时间完成它并开始重构。
在我的代码中,(当前)输入是这样的数据表:

目前的最终结果是这样的:

我修改了输入目录列表以包含一个更深的目录,它似乎没有问题。 我认为这里的神奇词可能是递归

希望函数 get_directory_roots 能给你一些想法。
编辑:
JSL功能列表addin也可以提供一些想法,我认为它没有超过1或2个级别
回复:从分层数据创建动态 JSL 树框这是我使用您的示例表整理的内容,可能会帮助您到达您想要的位置

Names Default To Here( 1 );
dt = Current Data Table();
maxLevels = Col Max( :EMPLEVEL );
dt << select where( :EMPLEVEL == 1 );
dtJoined = dt << subset( columns( :EMP_ID, :FULL_NAME ), selected rows( 1 ) );
For( m = 1, m <= N Cols( dtJoined ), m++,
Column( dtJoined, m ) << set name( Column( dtJoined, m ) << get name || "1" )
);
For( i = 2, i <= maxLevels, i++,
dt << select where( :EMPLEVEL == i );
dtTemp = dt << subset( columns( :EMP_ID, :FULL_NAME, :MGR_ID ), selected rows( 1 ) );
For( m = 1, m <= N Cols( dtTemp ), m++,
Column( dtTemp, m ) << set name( Column( dtTemp, m ) << get name || Char( i ) )
);
Eval(
Substitute(
Expr(
dtTemp2 = dtJoined << Join(
With( dtTemp ),
Merge Same Name Columns,
Match Flag( 0 ),
By Matching Columns( __emp__ = __mgr__ ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 )
)
),
Expr( __emp__ ), parse(":EMP_ID" || Char( i - 1 )),
Expr( __mgr__ ), Parse(":MGR_ID" || Char( i ))
)
);
Close( dtTemp, nosave );
Close( dtJoined, nosave );
dtJoined = dtTemp2;
);
theNameList={};
for(i=1,i<=maxLevels,i++,
insert into(theNameList, parse(":FULL_NAME" || char(i)))
);
Tabulate(
Show Control Panel( 0 ),
Add Table(
Row Table( Grouping Columns( eval(theNameList) ) )
)
)