Eval と Expr を理解したと思ったら...私は、このディスカッション グループのエントリを確認したり、スクリプト ガイドを確認したりしながら、2 日間この問題に取り組んできましたが、まだ何が問題なのかがわかりません。
変数を使用して列を参照しようとしています。スクリプトの行 65 ~ 75 (For Each Row の直前) から、Expr と Eval、Name Expr と As Column などを使用して、これを機能させるさまざまな方法を試しています。現在のスクリプトには、最新の反復だけが表示されています。
aggOption の値に応じて、Agg Minute (オプション 1) 列を 3 つの異なる方法のいずれかで入力する必要があります。実際の列名 :"Agg Minute (オプション 1)"n を Eval(colName3) の代わりに使用すると、意図したとおりに動作します。ただし、変数の定義または変数の評価で 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 を理解したと思ったら...ありがとう、ジャルモ。
解析オプションと先頭のコロンの有無を試しましたが、効果はありませんでした。ただし、上記で示した組み合わせは試していません。実行してみると、完全に理解できます。
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 形式が必要な何かを構築しようとしている場合、またはその形式で列を持つ方がクリーンな場合 (数式など) を除きます。