アプリケーション ビルダーを使用して初めて JMP アドインを開発しようとしていますが、以下に示すように JSL スクリプトで行き詰まってしまいました。
背景情報:
インターフェースはダイアログ タブの下に構築されました。
タイトルが Columns、Roles、Action の 3 つのパネル ボックスがあり、変数名はそれぞれ ColumnsPanel、RolesPanel、ActionPanel です。
列パネルの下に、変数名 ColList を持つ Col List Box (All) を追加しました。このボックスは、開いているデータ テーブル内のすべての列に取り込まれます。
ロール パネルで、3 つの列リスト ボックスと 3 つのボタン ボックスを追加しました。
最初の、2番目、3番目のCol List Boxの変数名は、それぞれResponseColList、FactorColList、BlockColListです。
最初のボタン ボックス、2 番目のボタン ボックス、3 番目のボタン ボックスの変数名は、それぞれ ResponseButton、FactorButton、BlockButton です。
最初のボタン ボックス、2 番目のボタン ボックス、3 番目のボタン ボックスのタイトルは、それぞれ「応答」、「要因」、および「ブロック」です。
アクション パネルの下に、タイトルが OK、Remove、Cancel の 3 つのボタン ボックスと、変数名がそれぞれ OKButton、RemoveButton、CancelButton であるボタン ボックスを追加しました。
応答ボタンをクリックすると、ColList から属性「A」、「B」、「C」、「D」、「E」の列が追加されました。
同様に、Factor and Block ボタンをクリックすると、ColList から「Site」と「People」の列が追加されました。

スクリプト:
//Part I
//Places selected columns into Role panel
On Response = Function({},
ResponseColList << Append( AllColList << Get Selected)
);
//Places selected columns into Factor panel
On Factor = Function({},
FactorColList << Append( AllColList << Get Selected)
);
//Places selected columns into Block panel
On Block = Function({},
BlockColList << Append( AllColList << Get Selected)
);
// Program the OK Button
On OK = Function({},
Response = ResponseColList << Get Items;
Factor = FactorColList << Get Items;
Block = BlockColList << Get Items;
// Get the current data table
dt = Current Data Table();
// Perform principal component analysis
pca = dt << Principal Components(
Y( Eval List( Response ) ),
Estimation Method( "NIPALS" ),
Standardize( "Standardized" )
);
pca << Save Principal Component Values( 3 );
pca << Close Window();
// Create a subset and delete columns "Prin1", "Prin2" and ""Prin3" in "dt"
dt << Subset(
Output Table("MET"),
All rows,
columns(Eval List(Block), Eval List(Factor), :Prin1, :Prin2, :Prin3)
);
dt << Delete Columns( "Prin1" ) << Delete Columns( "Prin2" ) << Delete Columns( "Prin3" );
// Standardize column attributes and create a data table "MET"
Current Data Table(Data Table("MET"));
For Each({col, index}, {:Prin1, :Prin2, :Prin3},
col << Format("Fixed Dec", 12, 2)
);
MET = Data Table( "MET" );
//Part II
//Get the levels in the Factor column
factorLevels = Associative Array(MET, Column(Eval List(Factor))) << Get Keys;
level1 = factorlevels[1];
level2 = factorlevels[2];
// Create two subsets named "Group1" and "Group2"
MET << Select Where( Column(Eval List(Factor)) == level1 ) << Subset( Output Table( "Group1" ), Selected Rows( 1 ), Selected columns only( 0 ) );
MET << Select Where( Column(Eval List(Factor)) == level2 ) << Subset( Output Table( "Group2" ), Selected Rows( 1 ), Selected columns only( 0 ) );
Group1 = Data Table( "Group1" );
Group2 = Data Table( "Group2" );
// Access the Site levels in "Group1" and "Group2"
Site_level1 = Column( Group1, "Site" ) << Get Values;
Site_level2 = Column( Group2 "Site" ) << Get Values;
);パート I のスクリプトは正常に実行できますが、パート II ではエラーが発生し続けるため、コードのデバッグにご協力いただければ幸いです。
ここでのもう 1 つの目標は、異なる属性名 (属性 "F"、"G" など) を持つデータセットを処理することです。スクリプトが特定の名前をハードコーディングするのではなく、選択した列名を動的に使用するようにしたいと考えています。
ありがとう!
パート2のどの部分が失敗し、エラーが発生していますか?
連想配列 - 最初の引数としてデータ テーブルを使用しますか?
Names Default to Here(1);
MET = Open( "$SAMPLE_DATA/Big Class.jmp" );
Factor={"height", "weight"};
Associative Array(MET, Column(Eval List(Factor)))