Gerade als ich dachte, ich hätte Eval und Expr verstanden ...Ich arbeite jetzt schon seit zwei Tagen an diesem Problem, habe die Einträge in dieser Diskussionsgruppe überprüft, bin den Skriptleitfaden durchgegangen usw., aber ich kann immer noch nicht herausfinden, was falsch ist.
Ich versuche, eine Variable zu verwenden, um auf eine Spalte zu verweisen. Ab den Skriptzeilen 65-75 (direkt vor For Each Row) probiere ich alle möglichen Arten aus, Expr und Eval und Name Expr und As Column usw. zu verwenden, damit dies funktioniert. Das aktuelle Skript zeigt nur die letzte Iteration.
Abhängig vom Wert von aggOption möchte ich, dass die Spalte Agg Minute (Option 1) auf eine von drei Arten ausgefüllt wird. Wenn Sie den tatsächlichen Spaltennamen :"Agg Minute (Option 1)"n anstelle von Eval(colName3) einsetzen, funktioniert es wie vorgesehen. Unabhängig davon, welche Kombination aus Eval, Expr usw. ich jedoch beim Definieren oder Auswerten der Variable verwende, erhalte ich entweder die folgende Fehlermeldung...

... ODER das Skript wird ohne Fehler ausgeführt, aber die Spalte wird nicht ausgefüllt.
Es scheint also, dass die linke Seite der Zuweisung nicht als Spaltenname interpretiert wird.
Ich bin sicher, dass dies ein einfaches Missverständnis meinerseits sein muss, entweder hinsichtlich der Funktionsweise von Eval und Expr oder der Funktionsweise der Choose-Funktion. Aber ich kann einfach nicht herausfinden, was es ist.
Weiß jemand, was ich falsch mache?
Danke wie immer.
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
)
)
);Automatisierung und SkriptingBetreff: Gerade als ich dachte, ich hätte Eval und Expr verstanden ...Es ist fast nie nötig, mit ":" herumzuspielen (ein ":" als String hinzuzufügen) und noch weniger mit Parse(). Wenn Sie mit For Each Row Werte für eine Spalte festlegen, können Sie beispielsweise Folgendes tun:
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
)
)
);
Dies ist zwar nicht die einzige Option, aber sie ist sehr einfach. Wenn Sie wirklich mit Ausdrücken experimentieren möchten, ist dies eine Möglichkeit
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
)
)
);
));
Eine nette Sache mit EvalExpr (dasselbe gilt für Substitute) ist, dass Sie den Ausdruck, der ausgewertet wird, wenn Eval verwendet wird, leicht sehen können, aber indem Sie den EvalExpr()-Teil auswählen und dann das ausführen

Betreff: Gerade als ich dachte, ich hätte Eval und Expr verstanden ...Danke, Jarmo.
Ich habe Optionen mit Parse und mit und ohne führenden Doppelpunkt ohne Erfolg ausprobiert. Die Kombinationen, die Sie oben gezeigt haben, habe ich jedoch nicht ausprobiert. Es ergibt vollkommen Sinn, wenn man es einmal in der Praxis sieht.
Betreff: Gerade als ich dachte, ich hätte Eval und Expr verstanden ...Interessant ist, dass man hier die Funktion Row() benötigt, obwohl sie bei Verwendung des tatsächlichen Spaltennamens gar nicht nötig ist. Das hätte ich nicht vermutet.
Betreff: Gerade als ich dachte, ich hätte Eval und Expr verstanden ...Das ist einfach meine bevorzugte Methode, da ich Column(dt, colname) verwende, wann immer ich kann (Sie können auch Row() weglassen und einfach Column()[] verwenden). Ich denke, es sollte auch mit As Column() funktionieren
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
)
)
);
aber meiner Meinung nach ist die Verwendung von As Column() viel lästiger, daher verwende ich es nicht so oft ... Außer wenn ich es mit Name Expr() verwende und versuche, etwas zu erstellen, das das Format :col erfordert, oder es einfach sauberer ist, Spalten in diesem Format zu haben (wie in Formeln).