저는 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"을 포함하는 목록을 만들 수 있었습니다. etc}, 그러나 그것이 내가 하려는 일에 필요한지 확실하지 않습니다.
본질적으로, 나의 제한된 코드 지식은 "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)을 추가했더니 제대로 작동했습니다! 나는 솔루션을 너무 복잡하게 만들었습니다. 도움을 주셔서 정말 감사합니다!