Sono abbastanza nuovo in JSL e ho una conoscenza di base della codifica in generale, quindi potrei non conoscere tutti i termini corretti per descrivere il mio problema, quindi mi scuso in anticipo.
Voglio automatizzare un processo che svolgo regolarmente in cui combino e trasformo 2 tabelle di dati. Ho già uno script che può farlo, ma sto cercando di capire come avere colonne di riferimento JMP invece di averle codificate perché i riferimenti alle colonne possono cambiare. Ad esempio, questa è una sezione del codice che fa già quello che voglio, ma è hardcoded:
(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" );
Il problema è che il numero di :"#"n non è sempre compreso tra 1 e 45 e talvolta può essere compreso tra 1 e 40. In questo momento elimino semplicemente 41-45 nel codice, se è così, ma voglio un modo per automatizzarlo in modo da non dover modificare il codice ogni volta. Sono riuscito a creare un elenco che contiene {"1"n, "2"n, "3"n, ecc} o un elenco che contiene {":1", ":2", ":3", etc}, ma non sono sicuro che sia necessario per quello che sto cercando di fare.
In sostanza, la mia conoscenza limitata del codice ritiene che un ciclo For all'interno della funzione "Partecipa" possa ottenere questo risultato, ma non ho trovato un modo per farlo funzionare. Inoltre, non so nemmeno se sia possibile un ciclo For all'interno della funzione "Unisci". Il mio processo di pensiero prevede che la soluzione assomigli a questa:
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" );Se c'è un riferimento a questo da qualche parte nei forum o nell'indice degli script, non riesco a trovare una discussione simile al riguardo, oppure potrei semplicemente non sapere come esprimere correttamente ciò che sto cercando di fare.
Di solito in casi come questo puoi semplicemente usare Eval() se hai un elenco delle tue colonne
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")
);
Funzionerà anche se hai colonne come stringhe (questo è il modo in cui lo faccio)
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")
);
O tramite Name Expr() - che è kind o 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, anche Print(collist); collist funziona... e collist viene stampato. Quindi, sembra che l'argomento venga valutato. Perché diavolo Select(collist) non funziona?
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")
);