Ich bin ein ziemlicher Neuling bei JSL und habe nur sehr grundlegende Kenntnisse über Codierung im Allgemeinen. Daher kenne ich möglicherweise nicht alle richtigen Begriffe, um mein Problem zu beschreiben. Ich entschuldige mich also schon jetzt.
Ich möchte einen Prozess automatisieren, den ich regelmäßig durchführe, bei dem ich zwei Datentabellen kombiniere und transformiere. Ich habe bereits ein Skript, das dies kann, aber ich versuche herauszufinden, wie ich JMP-Referenzspalten verwenden kann, anstatt sie fest zu codieren, da sich die Spaltenreferenzen ändern können. Dies ist beispielsweise ein Abschnitt des Codes, der bereits das tut, was ich möchte, aber fest codiert ist:
(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" );
Das Problem ist, dass die Anzahl der :"#"n nicht immer 1-45 ist, sondern manchmal 1-40. Momentan lösche ich einfach 41-45 im Code, wenn das der Fall ist, aber ich möchte das automatisieren, damit ich den Code nicht jedes Mal ändern muss. Ich konnte eine Liste erstellen, die {"1"n, "2"n, "3"n, etc} enthält, oder eine Liste, die {":1", ":2", ":3", etc} enthält, aber ich bin nicht sicher, ob das für das, was ich versuche, überhaupt nötig ist.
Im Wesentlichen lässt mein begrenztes Codewissen darauf schließen, dass eine For-Schleife innerhalb der Funktion „Join“ dies erreichen kann, aber ich habe noch keine Möglichkeit gefunden, dies zum Laufen zu bringen. Ich weiß auch nicht einmal, ob eine For-Schleife innerhalb der Funktion „Join“ möglich ist. Meiner Überlegung nach sieht die Lösung ungefähr so aus:
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" );Wenn es irgendwo in den Foren oder im Skriptindex einen Hinweis darauf gibt, kann ich entweder keine ähnliche Diskussion dazu finden oder ich weiß einfach nicht, wie ich das, was ich versuche, richtig formulieren soll.
Normalerweise können Sie in solchen Fällen einfach Eval() verwenden, wenn Sie eine Liste Ihrer Spalten haben
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")
);
Es funktioniert auch, wenn Sie Spalten als Zeichenfolgen haben (so mache ich es)
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")
);
Oder über Name Expr() - das ist Art oder 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")
);
Hm, sogar Print(collist); collist funktioniert ... und die collist wird gedruckt. Es scheint also, dass das Argument ausgewertet wird. Warum zum Teufel funktioniert Select(collist) nicht?
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")
);