Soy bastante nuevo en JSL y tengo conocimientos muy básicos sobre codificación en general, por lo que es posible que no conozca todos los términos adecuados para describir mi problema, por lo que me disculpo de antemano.
Quiero automatizar un proceso que hago regularmente donde combino y transformo 2 tablas de datos. Ya tengo un script que puede hacer esto, pero estoy tratando de descubrir cómo tener columnas de referencia JMP en lugar de codificarlas porque las referencias de las columnas pueden cambiar. Por ejemplo, esta es una sección del código que ya hace lo que quiero, pero está codificada:
(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" );
El problema es que el número de :"#"n no siempre es del 1 al 45 y, a veces, puede ser del 1 al 40. En este momento simplemente elimino 41-45 en el código si ese es el caso, pero quiero una manera de automatizar esto para no tener que cambiar el código cada vez. He podido crear una lista que contiene {"1"n, "2"n, "3"n, etc}, o una lista que contiene {":1", ":2", ":3", etc}, pero no estoy seguro de si eso es necesario para lo que estoy tratando de hacer.
Básicamente, mi conocimiento limitado del código cree que un bucle For dentro de la función "Unirse" puede lograr esto, pero no he encontrado una manera de hacerlo funcionar. Tampoco sé si es posible un bucle For dentro de la función "Unirse". Mi proceso de pensamiento tiene la solución más o menos así:
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" );Si hay una referencia a esto en algún lugar de los foros o del índice de secuencias de comandos, no puedo encontrar una discusión similar al respecto o simplemente no sé cómo expresar correctamente lo que estoy tratando de hacer.
Por lo general, en casos como este, puedes usar Eval() si tienes una lista de tus columnas.
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")
);
También funcionará si tienes columnas como cadenas (así es como lo hago)
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 mediante Name Expr() , que es 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, incluso Print(collist); collist funciona... y el collist se imprime. Entonces, parece que el argumento se evalúa. ¿Por qué diablos no funciona 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")
);