カテゴリ変数のすべてのレベルに対して同じ出力をスクリプト化するこんにちは、
いくつかの計算を実行し、いくつかのプラットフォームを実行して特定の出力を抽出し、新しいウィンドウにタブボックスを作成するスクリプトがあります。このすべての処理を、ユーザーがダイアログボックスで指定したカテゴリ変数の各レベルに対して実行したいと考えています。
現在、グループ化変数に基づいてデータの個別のサブセットを作成し、それらの各データセットをループしています。
dtSubset = dt << Subset( By( Eval( groupVar ) ), Linked, Selected Columns Only( 0 ), All Rows( 1 ), Invisible );
For( i = 1, i <= N Items( unique_groups ), i++,
dt_i = dtSubset[i];
...some code to do stuff
<BR />...append output as a new tab box in my window
);
Essentially all I am doing is coding up my own analysis and wanting a 'By' variable. I am wondering if there is a better or more efficient way to go about this? The main thing I want with the code is to have the output I create be specific for each level, while also still maintaining a connection to the original data table (meaning the plots in my output are interactive still).
ご覧のとおり、サブセットを Invisible として作成し、コード内でループの各反復の最後にサブセットを閉じています。
ありがとう、
ロバート
自動化とスクリプトRe: カテゴリ変数のすべてのレベルに同じ出力をスクリプト化するプラットフォーム内で By 変数を使用しない理由はありますか?
Re: カテゴリ変数のすべてのレベルに同じ出力をスクリプト化するグループ化列を使ってデータテーブルからタブボックスを作成する3つの方法をご紹介します。JMP18以上(たぶん)をお持ちなら、最後の方法が最もシンプルです。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Using subsets
dt_subsets = dt << Subset(
By(:age),
Linked,
Selected Columns Only(0),
All Rows(1),
Invisible
);
nw = New Window("Subsets",
tb = tab box()
);
dists = {};
For Each({dt_subset}, dt_subsets,
tb << Insert(Tab Page Box(Title(dt_subset << get name),
dt_subset << Distribution(
Continuous Distribution(Column(:weight)),
Nominal Distribution(Column(:age))
);
));
);
tb << Set Selected(1);
// Using Where in platform
nw = New Window("Where",
tb = tab box()
);
groups = Associative Array(Column(dt, "age")) << get keys;
dists = {};
For Each({group}, groups,
tb << Insert(Tab Page Box(Title("age=" || Char(group)),
dist = dt << Distribution(
Continuous Distribution(Column(:weight)),
Nominal Distribution(Column(:age)),
Where(:age == group)
);
));
(Report(dist) << Top Parent)[TextBox(1)] << Visibility("Collapse"); // to hide Where(... textbox
);
tb << Set Selected(1);
// Using By in platform
dist = dt << Distribution(
Group Options(Layout("Arrange in Tabs")),
Continuous Distribution(Column(:weight)),
Nominal Distribution(Column(:age)),
By(:age)
);
Re: カテゴリ変数のすべてのレベルに同じ出力をスクリプト化するJarmo のグループ別例を拡張して、出力のタブ ウィンドウを作成する例を次に示します。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
// Using By in platform
dist = dt << Distribution(Invisible,
Group Options(Layout("Arrange in Tabs")),
Continuous Distribution(Column(:weight)),
Nominal Distribution(Column(:age)),
By(:age)
);
// Create a new window and add tabs for each age
nw = New Window( "Tabs",
tabb = Tab Box();
);
For( i = 1, i <= N Items( dist ), i++,
display = Report( dist[i] );
theByGroup = display[Outline Box( 1 )] << get title;
tabb << append( Tab Page Box( Title( theByGroup ), display ) );
);

Re: カテゴリ変数のすべてのレベルに同じ出力をスクリプト化する本当の主な理由は、変数の異なるレベルをループ処理して各タブウィンドウを構築し、それから追加する方が簡単だと気づいたからです。各レベルでは、表の計算、グラフビルダーを使ったグラフの作成、Distプラットフォームからのqqプロットの抽出、フィットモデルプラットフォームからのスチューデント化残差プロットの抽出などを行っています。
Re: カテゴリ変数のすべてのレベルに同じ出力をスクリプト化するお二人ともご意見ありがとうございます。提供いただいたコードはすべて正常に動作しました。ちなみに、現在、様々なプラットフォームからデータを取得し、斬新な出力も作成する、かなり複雑なアドインを作成中です。本当にやりたかったのは、データテーブルにリンクされているグラフや表を、そのままの状態に維持することでした。また、すべてのタブの見た目を統一したかったので、ループ処理は簡単な解決策だと思いました。
これを実行する最善の方法は、使用しているすべてのプラットフォームで By オプションを使用し、さまざまなパスを使用して各コンポーネントを呼び出し、それらを必要な場所に追加しながら変数のレベルをループすることだと思われますか?
Re: カテゴリ変数のすべてのレベルに同じ出力をスクリプト化するJimが実演したように追加すると、インタラクティブ性が失われてしまいます。Subset/Whereはどちらも非常にうまく機能しますが、サマリーテーブルの作成など、Whereを簡単に利用できない場合があります(単純なWhereではなく、ローカルデータフィルターを使用します)。また、サブセットを使用すると、メインテーブルを閉じる際に期待どおりに閉じない可能性があり、結果として多くのデータテーブルを処理する必要が生じる可能性があります。データフィルターコンテキストボックスを使用して1つのフィルターを複数のプラットフォームで使用できるため、ローカルデータフィルターの使用も検討する価値がある場合があります。