階層データからの動的な JSL ツリー ボックスの作成階層データを使用して動的にネストされたツリー ボックスを作成する方法を誰かが提案していただけますか。 今夜数時間試してみましたが、混乱しています:(
以下に、3 レベルの深さの関係を示すダミー データをいくつか用意しています。 明らかに、何レベルの「ネスト」を作成する必要があるか事前にわからないため、これをハードコーディングしたくありません。 実際には10レベル以上になります。
乾杯、トロイ
これが私が始めるものです(表を添付)

これが私が生成したいものです

自動化とスクリプト作成Re: 階層データからの動的 JSL ツリー ボックスの作成コードが切り詰められているようです
Re: 階層データからの動的 JSL ツリー ボックスの作成閉じたノードを再度開くことができない問題をご報告いただきありがとうございます。 @Craige_Hales 。このバグは JMP 17 で解決されました。
Re: 階層データからの動的 JSL ツリー ボックスの作成はい私は同意する。 非常にエレガントなソリューション。 私は親子関係を追跡する道を進んでいたのですが、物事が混乱し始めていました。
返信、多くの優れたコードのスニペットをありがとうございました。
- トロイ
Re: 階層データからの動的 JSL ツリー ボックスの作成特性要因図には、再配置するための右クリック メニューがあります。 これらはすべて同じディスプレイボックス ツリーを使用します。 ラベルと同様に、他のコントロールをツリーに追加することができます。 プラットフォームは、「Analyze」->「QualityAndProcess」->「Diagram」の下に隠れています。
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 ではそれが可能です。 問題を報告しました。
Re: 階層データからの動的 JSL ツリー ボックスの作成@Erratic Attack
素晴らしい解決策です!
Re: 階層データからの動的 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>
Re: 階層データからの動的 JSL ツリー ボックスの作成ここからいくつかのアイデアが得られるかもしれませんディレクトリ ツリー: フォルダーによって使用されているスペースを調査するまたは、おそらく私が取り組んでいるファイルインデクサーからjthi-jmp-tools/file-indexer (github.com) (bin/bin/DirectoryTreeHandler.jsl を参照してください。まだ私が望むほど汎用的ではありませんが、うまくいけばそこに到達します)、完成させる時間がなかったため、私のコードは現在混乱しています。そしてリファクタリングを開始します。
私のコードでは、(現在の)入力は次のようにデータ可能です。

そして現在の最終結果は次のようになります:

入力ディレクトリのリストを変更して、より深いディレクトリを 1 つ含めましたが、問題はないようでした。 ここでの魔法の言葉は再帰かもしれないと思います

get_directory_roots 関数がいくつかのアイデアを提供してくれることを願っています。
編集:
JSL関数一覧アドインはいくつかのアイデアを提供することもできますが、1 つまたは 2 つのレベルしかなかったと思います
Re: 階層データからの動的 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) ) )
)
)