Proprio quando pensavo di aver capito Eval ed Expr...Ho lavorato su questo problema per due giorni, esaminando le voci in questo gruppo di discussione, esaminando la guida allo scripting, ecc., ma non riesco ancora a capire cosa c'è che non va.
Sto provando a usare una variabile per fare riferimento a una colonna. Dalle righe 65-75 dello script (subito prima di For Each Row), sto provando tutti i modi possibili per usare Expr ed Eval e Name Expr e As Column, ecc. per farlo funzionare. Lo script corrente in mostra solo l'iterazione più recente.
A seconda del valore di aggOption, voglio che la colonna Agg Minute (Option 1) si riempia in uno dei tre modi diversi. Se sostituisci il nome effettivo della colonna :"Agg Minute (Option 1)"n al posto di Eval( colName3), funziona come previsto. Tuttavia, indipendentemente dalla combinazione di Eval, Expr, ecc. che uso per definire la variabile o valutarla, ottengo il seguente messaggio di errore...

... OPPURE lo script viene eseguito senza errori ma la colonna non viene compilata.
Sembra quindi che il lato sinistro dell'assegnazione non venga interpretato come un nome di colonna.
Sono sicuro che questo deve essere un semplice malinteso da parte mia su come funzionano Eval ed Expr o su come funziona la funzione Choose. Ma non riesco a capire di cosa si tratta.
Qualcuno ha idea di cosa sto sbagliando?
Grazie come sempre.
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
)
)
);Automazione e scriptingRe: Proprio quando pensavo di aver capito Eval ed Expr...Non c'è quasi mai bisogno di iniziare a pasticciare con ":" (aggiungendo ":" come stringa) e ancora meno con Parse(). Quando si impostano valori per una colonna con For Each Row, si può fare qualcosa del genere, ad esempio
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
)
)
);
Questa non è l'unica opzione, ma è molto semplice. Se vuoi davvero iniziare a pasticciare con le espressioni, questo è un modo
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
)
)
);
));
Una cosa bella di EvalExpr (lo stesso vale per Substitute) è che puoi vedere facilmente l'espressione che verrà valutata se viene utilizzato Eval, ma selezionando la parte EvalExpr() e quindi eseguendola

Re: Proprio quando pensavo di aver capito Eval ed Expr...Grazie, Jarmo.
Ho provato opzioni con parse e con e senza i due punti iniziali, ma senza successo. Tuttavia, non ho provato le combinazioni che hai mostrato sopra. Ha perfettamente senso una volta che lo vedi fatto.
Re: Proprio quando pensavo di aver capito Eval ed Expr...È interessante che qui tu abbia bisogno della funzione Row() quando non è necessaria se usi il nome effettivo della colonna. Non l'avrei mai immaginato.
Re: Proprio quando pensavo di aver capito Eval ed Expr...Questo è semplicemente il mio metodo preferito, poiché uso Column(dt, colname) ogni volta che posso (puoi anche eliminare Row() e usare semplicemente Column()[]). Penso che dovrebbe funzionare anche con 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
)
)
);
ma secondo me As Column() è molto più fastidioso da usare, quindi non lo uso molto... Tranne quando lo uso con Name Expr() e sto cercando di creare qualcosa che richiede il formato :col o semplicemente è più pulito avere una colonna in quel formato (come nelle formule).