Je suis relativement nouveau sur JSL et j'ai des connaissances très basiques sur le codage en général, donc je ne connais peut-être pas tous les termes appropriés pour décrire mon problème, je m'excuse donc d'avance.
Je souhaite automatiser un processus que je fais régulièrement où je combine et transforme 2 tables de données. J'ai déjà un script qui peut faire cela, mais j'essaie de comprendre comment avoir des colonnes de référence JMP au lieu de les coder en dur car les références de colonnes peuvent changer. Par exemple, il s'agit d'une section du code qui fait déjà ce que je veux, mais qui est codée en dur :
(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" );
Le problème est que le nombre de :"#"n n'est pas toujours compris entre 1 et 45, et peut parfois être compris entre 1 et 40. Pour le moment, je supprime simplement 41-45 dans le code si tel est le cas, mais je veux un moyen d'automatiser cela pour ne pas avoir à changer le code à chaque fois. J'ai pu créer une liste contenant {"1"n, "2"n, "3"n, etc}, ou une liste contenant {":1", ":2", ":3", etc}, mais je ne sais pas si cela est même nécessaire pour ce que j'essaie de faire.
Essentiellement, mes connaissances limitées en code pensent qu'une boucle For dans la fonction "Rejoindre" peut accomplir cela, mais je n'ai pas trouvé de moyen de le faire fonctionner. Je ne sais même pas non plus si une boucle For est possible dans la fonction "Rejoindre". Mon processus de réflexion a la solution qui ressemble à ceci :
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" );S'il y a une référence à cela quelque part dans les forums ou dans l'index des scripts, soit je ne trouve pas de discussion similaire à ce sujet, soit je ne sais tout simplement pas comment exprimer correctement ce que j'essaie de faire.
Habituellement, dans des cas comme celui-ci, vous pouvez simplement utiliser Eval() si vous avez la liste de vos colonnes
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")
);
Cela fonctionnera également si vous avez des colonnes sous forme de chaînes (c'est comme ça que je procède)
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")
);
Ou via Name Expr() - qui est kind ou 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, même Print(collist); Collist fonctionne... et le Collist est imprimé. Il semble donc que l'argument soit évalué. Pourquoi diable Select(collist) ne fonctionne-t-il pas ?
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")
);