Eval과 Expr을 이해했다고 생각했을 때...저는 이 문제에 대해 토론 그룹의 항목을 검토하고 스크립팅 가이드를 살펴보는 등 이틀간 노력해 왔지만 여전히 무엇이 문제인지 알아낼 수 있습니다.
변수를 사용하여 열을 참조하려고 합니다. 스크립트 행 65-75(For Each Row 바로 앞)에서 Expr과 Eval, Name Expr, As Column 등을 사용하여 이 작업을 수행하는 모든 방법을 시도하고 있습니다. 현재 스크립트는 가장 최근의 반복만 표시합니다.
aggOption의 값에 따라 Agg Minute(옵션 1) 열이 세 가지 다른 방식 중 하나로 채워지기를 원합니다. Eval(colName3) 대신 실제 열 이름인 "Agg Minute(옵션 1)"n을 대체하면 의도한 대로 작동합니다. 그러나 변수를 정의하거나 변수를 평가하는 데 Eval, Expr 등의 조합을 사용하더라도 다음과 같은 오류 메시지가 표시됩니다.

... 또는 스크립트가 오류 없이 실행되지만 열은 채워지지 않습니다.
따라서 할당의 왼쪽은 열 이름으로 해석되지 않는 것 같습니다.
이건 제가 Eval과 Expr의 작동 방식이나 Choose 함수의 작동 방식에 대해 오해한 것일 거라고 확신합니다. 하지만 무슨 일인지 알아낼 수가 없습니다.
제가 뭘 잘못하고 있는지 아시는 분 계신가요?
항상 감사합니다.
Names Default To Here( 1 );
// SETUP: Create Raw Data Table
Try( Close( "Interpolated Data"));
Try( Close( "Test rt"));
rt = New Table( "Test rt",
Add Rows( 5 ),
New Column( "Timestamp", Continuous, Format( "m/d/y h:m", 19 ), set values( [3742070400, 3742070880, 3742071360, 3742071840, 3742072320] ) ),
New Column( "Data", set values( [899.084, 897.387, 898.518, 897.575, 897.387] ) )
);
t1 = column( rt,1) << Get Name;
t2 = column( rt,2) << Get Name;
timeCol = Parse(":" || t1);
dataCol = Parse(":" || t2);
Print( timeCol);
Print( dataCol);
rtRows = N Rows( rt );
startTime = rt:Timestamp[1];
endTime = rt:Timestamp[rtRows];
minDuration = (endTime - startTime) / 60;
// CREATE SECONDARY TABLE
dt = New Table( "Interpolated Data Temp" );
dt << New Column( "Timestamp", Format( "m/d/y h:m", 19 ), Set Display Width( 250 ) );
dt << Add Rows( minDuration );
For Each Row( dt, :Timestamp[] = Sequence( startTime, endTime, 60 ) );
// JOIN BOTH TABLES
dt << Join(
With( rt ),
Suppress formula evaluation( 0 ),
Select( :Timestamp ),
SelectWith( Name Expr(dataCol)),
By Matching Columns( :Timestamp = :Timestamp ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve main table order( 1 ),
Output Table( "Interpolated Data" )
);
dt2 = Data Table( "Interpolated Data" );
Close( dt, NoSave );
Close( rt, NoSave );
// CREATE AGG MINUTE/AGG QUADRANT COLUMNs
// These are the columns that will define which minutes are included in each quadrant and how the quadrant will be labled.
// The choice of how the columns will be filled depends on the Option chosen above.
// **************************************************************************
aggOption = 1;
colName1 = "Agg Minute (Option " || char(aggOption) || ")";
colName2 = "Agg Quadrant (Option " || char(aggOption) || ")";
Print( colName1);
Print( ColName2);
colName3 = Name Expr(":" || colName1);
colName4 = Name Expr(":" || colName2);
Print( colName3);
Print( colName4);
New Column(colName1, Numeric, "Ordinal", Format("Best", 12), Set Display Width(116)); // To Do: Add chosen agg option to column name
New Column(colName2, Numeric, "Ordinal", Format("Best", 12), Set Display Width(116)); // To Do: Add chosen agg option to column name
For Each Row(dt2,
Eval(colName3) = Choose(aggOption, // Substituting an actual column name (:"Agg Minute (Option 1)"n works)
If(
Minute(:Timestamp) < 15, 15, // Option 1
Minute(:Timestamp) < 30, 30,
Minute(:Timestamp) < 45, 45,
0
),
If(
Minute(:Timestamp) < 15, 0, // Option 2
Minute(:Timestamp) < 30, 15,
Minute(:Timestamp) < 45, 30,
45
),
If(
0 < Minute(:Timestamp) <= 15, 15, // Option 3
15 < Minute(:Timestamp) <= 30, 30,
30 < Minute(:Timestamp) <= 45, 45,
0
)
)
);자동화 및 스크립팅Re: Eval과 Expr을 이해했다고 생각했던 순간...":"를 엉망으로 만들 필요가 거의 없고(":"를 문자열로 추가) Parse()를 사용할 필요도 거의 없습니다. For Each Row로 열에 값을 설정할 때 다음과 같이 할 수 있습니다.
For Each Row(
dt2,
Column(dt2, colName1)[Row()] = Choose(aggOption, // Substituting an actual column name (:"Agg Minute (Option 1)"n works)
If(
Minute(:Timestamp) < 15, 15, // Option 1
Minute(:Timestamp) < 30, 30,
Minute(:Timestamp) < 45, 45,
0
),
If(
Minute(:Timestamp) < 15, 0, // Option 2
Minute(:Timestamp) < 30, 15,
Minute(:Timestamp) < 45, 30,
45
),
If(
0 < Minute(:Timestamp) <= 15, 15, // Option 3
15 < Minute(:Timestamp) <= 30, 30,
30 < Minute(:Timestamp) <= 45, 45,
0
)
)
);
이것이 유일한 옵션은 아니지만 매우 간단합니다. 표현을 실제로 엉망으로 만들고 싶다면 이것이 한 가지 방법입니다.
Eval(EvalExpr(
For Each Row(
dt2,
Expr(Name Expr(AsColumn(dt2, colName1))) = Choose(aggOption, // Substituting an actual column name (:"Agg Minute (Option 1)"n works)
If(
Minute(:Timestamp) < 15, 15, // Option 1
Minute(:Timestamp) < 30, 30,
Minute(:Timestamp) < 45, 45,
0
),
If(
Minute(:Timestamp) < 15, 0, // Option 2
Minute(:Timestamp) < 30, 15,
Minute(:Timestamp) < 45, 30,
45
),
If(
0 < Minute(:Timestamp) <= 15, 15, // Option 3
15 < Minute(:Timestamp) <= 30, 30,
30 < Minute(:Timestamp) <= 45, 45,
0
)
)
);
));
EvalExpr의 좋은 점 중 하나는(Substitute와 동일한 거래) Eval이 사용되면 평가될 표현식을 쉽게 볼 수 있다는 점입니다. 그러나 EvalExpr() 부분을 선택한 다음 해당 부분을 실행하면 됩니다.

Re: Eval과 Expr을 이해했다고 생각했던 순간...고맙네요, 자르모.
저는 parse와 선행 콜론이 있는 옵션과 없는 옵션을 시도했지만 소용이 없었습니다. 그러나 위에서 보여 주신 조합은 시도하지 않았습니다. 한 번 해보시면 완벽하게 이해가 됩니다.
Re: Eval과 Expr을 이해했다고 생각했던 순간...실제 열 이름을 사용하면 필요하지 않은 Row() 함수가 여기서 필요하다는 점이 흥미롭습니다. 저는 그걸 짐작하지 못했을 겁니다.
Re: Eval과 Expr을 이해했다고 생각했던 순간...그것은 내가 할 수 있을 때마다 Column(dt, colname)을 사용하는 것처럼 내가 선호하는 방법입니다(Row()를 삭제하고 Column()[]을 사용할 수도 있습니다). As Column()과도 작동해야 한다고 생각합니다.
For Each Row(
dt2,
As Column(dt2, colName1) = Choose(aggOption, // Substituting an actual column name (:"Agg Minute (Option 1)"n works)
If(
Minute(:Timestamp) < 15, 15, // Option 1
Minute(:Timestamp) < 30, 30,
Minute(:Timestamp) < 45, 45,
0
),
If(
Minute(:Timestamp) < 15, 0, // Option 2
Minute(:Timestamp) < 30, 15,
Minute(:Timestamp) < 45, 30,
45
),
If(
0 < Minute(:Timestamp) <= 15, 15, // Option 3
15 < Minute(:Timestamp) <= 30, 30,
30 < Minute(:Timestamp) <= 45, 45,
0
)
)
);
하지만 제 생각엔 As Column()은 사용하기 훨씬 번거로워서 그렇게 많이 쓰지 않습니다... Name Expr()과 함께 사용할 때를 제외하고는 :col 형식이 필요한 것을 빌드하려고 하거나 해당 형식으로 열을 갖는 것이 더 깔끔합니다(예: 수식에서).