私は JSL にかなり不慣れで、コーディング全般に関する知識もごく基本的なものしかないため、自分の問題を説明するのに適切な用語をすべて知っているわけではないかもしれませんので、あらかじめお詫び申し上げます。
定期的に行う、2 つのデータ テーブルを結合して変換するプロセスを自動化したいと考えています。これを実行できるスクリプトはすでにありますが、列参照は変更される可能性があるため、列をハードコードするのではなく、JMP で列を参照する方法を考えています。たとえば、これは私がすでに望んでいることを実行しているものの、ハードコードされているコード セクションです。
(Data Table( baselined_dt ) <<
Join(
With( Data Table( main_dt ) ),
Select( :SampleId, :ReplicateId ),
SelectWith(
dlg["data_list"], :ReplicateId // Lets user select columns//
),
Select(
:Dye, :Type, :"1"n, :"2"n, :"3"n, :"4"n, :"5"n, :"6"n, :"7"n, :"8"n, :"9"n,
:"10"n, :"11"n, :"12"n, :"13"n, :"14"n, :"15"n, :"16"n, :"17"n, :"18"n,
:"19"n, :"20"n, :"21"n, :"22"n, :"23"n, :"24"n, :"25"n, :"26"n, :"27"n,
:"28"n, :"29"n, :"30"n, :"31"n, :"32"n, :"33"n, :"34"n, :"35"n, :"36"n,
:"37"n, :"38"n, :"39"n, :"40"n, :"41"n, :"42"n, :"43"n, :"44"n, :"45"n
),
By Matching Columns( :ReplicateId = :ReplicateId ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 )
)) << Set Name( "Joined Data Table" );
問題は、:"#"n の数が常に 1 から 45 であるとは限らず、1 から 40 になることもあることです。現在、その場合はコード内の 41 から 45 を削除するだけですが、毎回コードを変更しなくても済むように、これを自動化する方法が必要です。{"1"n、"2"n、"3"n など} を含むリスト、または {":1"、":2"、":3" など} を含むリストを作成することはできましたが、私がしようとしていることにそれが必要なのかどうかはわかりません。
基本的に、私の限られたコード知識では、「Join」関数内の For ループでこれを達成できると考えていますが、それを機能させる方法が見つかりませんでした。また、「Join」関数内で For ループが可能かどうかもわかりません。私の思考プロセスでは、解決策は次のようになります。
cycle_list = {};
For( i = 1, i <= N Items(cycle_num), i++,
y1 = cycle_num[i];
y2 = (":" || y1);
InsertInto(cycle_list, y2)
);
(Data Table( baselined_dt ) <<
Join(
With( Data Table( main_dt ) ),
Select( :SampleId, :ReplicateId ),
SelectWith(
dlg["data_list"], :ReplicateId // Lets user select columns//
),
Select(
:Dye, :Type,
For( i = 1, i <= N Items( cycle_list ), i++,
cycle_list[i];
);
),
By Matching Columns( :ReplicateId = :ReplicateId ),
Drop multiples( 0, 0 ),
Include Nonmatches( 0, 0 ),
Preserve main table order( 1 )
)) << Set Name( "Joined Data Table" );フォーラムまたはスクリプト インデックスのどこかにこれに関する言及がある場合、それに関する同様の議論が見つからないか、または自分がやろうとしていることを正しく表現する方法がわからないだけかもしれません。
通常、このような場合には、列のリストがあればEval()を使用できます。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Trial1.jmp");
dt2 = Open("$SAMPLE_DATA/Little.jmp");
collist = {:popcorn, :oil amt, :batch, :yield};
dt_joined = dt << Join(
With(dt2),
Select(Eval(collist)),
SelectWith(:yield),
By Matching Columns(:popcorn = :popcorn, :batch = :batch, :oil amt = :oil),
Output Table("Join table")
);
列を文字列として持つ場合にも機能します(これが私のやり方です)
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Trial1.jmp");
dt2 = Open("$SAMPLE_DATA/Little.jmp");
collist = {"popcorn", "oil amt", "batch", "yield"};
dt_joined = dt << Join(
With(dt2),
Select(Eval(collist)),
SelectWith(:yield),
By Matching Columns(:popcorn = :popcorn, :batch = :batch, :oil amt = :oil),
Output Table("Join table")
);
またはName Expr()経由 - kindまたはsqrt( Eval() )
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Trial1.jmp");
dt2 = Open("$SAMPLE_DATA/Little.jmp");
collist = {"popcorn", "oil amt", "batch", "yield"};
dt_joined = dt << Join(
With(dt2),
Select(Name Expr(collist)),
SelectWith(:yield),
By Matching Columns(:popcorn = :popcorn, :batch = :batch, :oil amt = :oil),
Output Table("Join table")
);
うーん、 Print(collist); collistでも動作します...そして collist が印刷されます。つまり、引数が評価されるようです。一体なぜSelect(collist)が動作しないのでしょうか?
dt_joined = dt << Join(
With(dt2),
Select(Print(collist);collist),
SelectWith(:yield),
By Matching Columns(:popcorn = :popcorn, :batch = :batch, :oil amt = :oil),
Output Table("Join table")
);
Eval コマンドについては知りませんでした。列をリスト内の文字列として持っていたため、あなたと同じように Eval(cycle_num) を追加しただけでうまくいきました。解決策を複雑にしすぎていました。ご協力いただき、本当にありがとうございました。