Ciao a tutti!
Ho provato a selezionare una colonna in una tabella di dati generata ea trasformare quella colonna in una nuova tabella di dati. Di seguito è riportato il mio codice:
//part 1: generate a data table<BR />ret = New Table( title,
Add Rows (rowNum),
New Column( "P", Expression, "Continuous", Formula( pmatrix ) ),
New Column( "X(n)",
Expression,
"None",
Formula( If( Row() == 1, init_state, Lag( :Name( "X(n)" ), 1 ) * :p</img> ) ),
Set Selected,
),
New Column( "steady state",
Expression,
"None",
Formula( :Name( "X(n)" ) - Lag( :Name( "X(n)" ) ) == zeros ),
),
New Column( "States", Character, Values( names ) ),
);
// part 2: select column X(n) and transform it into a new table
<STRONG>mat = Column(ret,"X(n)")[1];
show(mat);</STRONG>
For(i = 2, i <= N Rows(ret), i++,
V Concat To(mat,Column(ret,"X(n)")[i]);
);
table = As Table(mat);
names = Column(ret, "States") << get values;
For(i = 1, i <= N Col(table), i++,
Column(i) << Set Name( names[i] );
);
Quando ho testato le due parti separatamente salvando la tabella dei risultati nella parte 1 e quindi eseguendo la parte 2, funziona. Ma non voglio salvare la tabella nella parte 1 ogni volta prima di eseguire la parte 2, quindi li ho messi insieme. Tuttavia, lo script unito non funziona. In questo caso, la tabella restituita dalla parte 2 ha solo valori mancanti (Empty()).
Aggiungo "show(mat);" nello script per vedere cosa è successo e mostra "mat = Empty();" nel registro. Il valore atteso di mat dovrebbe essere un vettore come in ogni riga della colonna X(n) della tabella dei dati nella parte 1.
Non so cosa sia andato storto. Qualsiasi aiuto sarebbe apprezzato!
E grazie per la segnalazione; la funzione di colonna eseguirà <
wait(n) non è la soluzione migliore; è difficile sapere se n è abbastanza grande. JMP valuta le formule della tabella in background. Il modo migliore per assicurarsi che abbiano valutato è
ret << RunFormulas;
dopo aver costruito la tavola. Valuterà le formule della tabella più velocemente che aspettarle.
Ho trovato una soluzione che può risolvere il mio problema: l'aggiunta di "wait(1)" tra le due parti funzionerà. (riferimento:
https://community.jmp.com/t5/Discussions/Add-new-column-with-formula-to-data-table-at-certain-position/td-p/14602).
ma non capisco perché funziona... C'è un altro modo che può risolvere anche questo problema?
Scusate. Non so perché qualcosa è andato storto con il formato. La prima riga della sceneggiatura è commentata...
ret = New Table(
Add Rows (rownum),
New Column( "P", Expression, "Continuous", Formula( ptable << get as matrix ) ),
New Column( "X(n)",
Expression,
"None",
Formula( If( Row() == 1, init_state, Lag( :Name( "X(n)" ), 1 ) * :p</img> ) ),
Set Selected,
),
New Column( "steady state",
Expression,
"None",
Formula( :Name( "X(n)" ) - Lag( :Name( "X(n)" ) ) == zeros ),
),
New Column( "States", Character, Values( names ) ),
);
Non vedo il riferimento alla variabile "ret".Nella seconda metà del codice si usa ret, ma non nella prima metà...